ALTER TABLE computed_column_definition (Transact-SQL)
Berlaku untuk:
SQL Server (semua versi yang didukung)
Azure SQL Database
Menentukan properti kolom komputasi yang ditambahkan ke tabel dengan menggunakan ALTER TABLE.
Sintaks
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ WITH ( <index_option> [, ...n ] ) ]
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
| [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]
Catatan
Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.
Argumen
column_name
Adalah nama kolom yang akan diubah, ditambahkan, atau dihilangkan. column_name bisa 1 hingga 128 karakter. Untuk kolom baru, column_name dapat dihilangkan untuk kolom yang dibuat dengan jenis data tanda waktu . Jika tidak ada column_name yang ditentukan untuk kolom jenis data tanda waktu , tanda waktu nama akan digunakan.
computed_column_expression
Adalah ekspresi yang menentukan nilai kolom komputasi. Kolom komputasi adalah kolom virtual yang tidak disimpan secara fisik dalam tabel tetapi dihitung dari ekspresi yang menggunakan kolom lain dalam tabel yang sama. Ekspresi harus menghasilkan nilai. Misalnya, kolom komputasi dapat memiliki definisi: biaya AS harga * qty. Contoh lain dengan operator bitwise: is_finalised AS is_checked | is_approved. Ekspresi dapat berupa nama kolom, konstanta, fungsi, variabel, dan kombinasi apa pun yang disambungkan oleh satu atau beberapa operator. Ekspresi tidak boleh berupa kondisi pencarian, subkueri, atau menyertakan tipe data alias.
Kolom komputasi dapat digunakan dalam daftar pilihan, klausa WHERE, klausa ORDER BY, atau lokasi lain di mana ekspresi reguler dapat digunakan, tetapi dengan pengecualian berikut:
Kolom komputasi tidak dapat digunakan sebagai definisi batasan DEFAULT atau FOREIGN KEY atau dengan definisi batasan NOT NULL. Namun, jika nilai kolom komputasi ditentukan oleh ekspresi deterministik dan jenis data hasil diizinkan dalam kolom indeks, kolom komputasi dapat digunakan sebagai kolom kunci dalam indeks atau sebagai bagian dari batasan KUNCI PRIMER atau UNIK apa pun.
Misalnya, jika tabel memiliki kolom bilangan bulat a dan b, kolom komputasi a + b dapat diindeks, tetapi kolom komputasi a + DATEPART(dd, GETDATE()) tidak dapat diindeks, karena nilainya mungkin berubah dalam pemanggilan berikutnya.
Kolom komputasi tidak dapat menjadi target pernyataan INSERT atau UPDATE.
Catatan
Karena setiap baris dalam tabel dapat memiliki nilai yang berbeda untuk kolom yang terlibat dalam kolom komputasi, kolom komputasi mungkin tidak memiliki hasil yang sama untuk setiap baris.
BERTAHAN
Menentukan bahwa Mesin Database akan secara fisik menyimpan nilai komputasi dalam tabel, dan memperbarui nilai ketika kolom lain tempat kolom komputasi bergantung diperbarui. Menandai kolom komputasi sebagai PERSISTED memungkinkan indeks dibuat pada kolom komputasi yang deterministik, tetapi tidak tepat. Untuk informasi selengkapnya, lihat Indeks pada Kolom Komputasi. Setiap kolom komputasi yang digunakan sebagai kolom partisi dari tabel yang dipartisi harus ditandai secara eksplisit PERSISTED. computed_column_expression harus deterministik ketika PERSISTED ditentukan.
| NULL BUKAN NULL
Menentukan apakah nilai null diperbolehkan dalam kolom. NULL bukan batasan yang ketat tetapi dapat ditentukan seperti NOT NULL. NOT NULL dapat ditentukan untuk kolom komputasi hanya jika PERSISTED juga ditentukan.
CONSTRAINT
Menentukan awal definisi untuk batasan KUNCI PRIMER atau UNIK.
constraint_name
Adalah batasan baru. Nama batasan harus mengikuti aturan untuk pengidentifikasi, kecuali bahwa nama tidak dapat dimulai dengan tanda angka (#). Jika constraint_name tidak disediakan, nama yang dihasilkan sistem ditetapkan ke batasan.
KUNCI PRIMER
Adalah batasan yang memberlakukan integritas entitas untuk kolom atau kolom tertentu dengan menggunakan indeks unik. Hanya satu batasan KUNCI PRIMER yang dapat dibuat untuk setiap tabel.
UNIQUE
Adalah batasan yang menyediakan integritas entitas untuk kolom atau kolom tertentu dengan menggunakan indeks unik.
| TERKLUSTER TIDAK BERKLUSTER
Menentukan bahwa indeks berkluster atau non-kluster dibuat untuk batasan KUNCI PRIMER atau UNIK. BATASAN KUNCI PRIMER default ke CLUSTERED. Batasan UNIK default ke NONCLUSTERED.
Jika batasan atau indeks berkluster sudah ada pada tabel, CLUSTERED tidak dapat ditentukan. Jika batasan atau indeks berkluster sudah ada pada tabel, KUNCI PRIMER membatasi default ke NONCLUSTERED.
DENGAN FILLFACTOR =fillfactor
Menentukan seberapa lengkap mesin database SQL Server harus membuat setiap halaman indeks digunakan untuk menyimpan data indeks. Nilai fillfactor yang ditentukan pengguna bisa dari 1 hingga 100. Jika nilai tidak ditentukan, defaultnya adalah 0.
Penting
Dokumentasi DENGAN FILLFACTOR = fillfactor sebagai satu-satunya opsi indeks yang berlaku untuk batasan KUNCI PRIMER atau UNIK dipertahankan untuk kompatibilitas mundur, tetapi tidak akan di dokumentasikan dengan cara ini dalam rilis mendatang. Opsi indeks lain dapat ditentukan dalam klausa index_option (Transact-SQL) dari ALTER TABLE.
REFERENSI KUNCI ASING
Adalah batasan yang memberikan integritas referensial untuk data di kolom atau kolom. Batasan KUNCI ASING mengharuskan setiap nilai dalam kolom ada di kolom atau kolom yang dirujuk terkait dalam tabel yang dirujuk. Batasan FOREIGN KEY hanya dapat mereferensikan kolom yang merupakan batasan KUNCI PRIMER atau UNIK dalam tabel atau kolom yang dirujuk dalam INDEKS UNIK pada tabel yang dirujuk. Kunci asing pada kolom komputasi juga harus ditandai PERSISTED.
ref_table
Adalah nama tabel yang dirujuk oleh batasan KUNCI ASING.
(ref_column )
Adalah kolom dari tabel yang dirujuk oleh batasan KUNCI ASING.
ON DELETE { NO ACTION | CASCADE }
Menentukan tindakan apa yang terjadi pada baris dalam tabel jika baris tersebut memiliki hubungan referensial dan baris yang dirujuk dihapus dari tabel induk. Defaultnya adalah TIDAK ADA TINDAKAN.
TIDAK ADA TINDAKAN
Mesin Database menimbulkan kesalahan dan tindakan hapus pada baris dalam tabel induk digulung balik.
CASCADE
Baris terkait dihapus dari tabel referensi jika baris tersebut dihapus dari tabel induk.
Misalnya, dalam database AdventureWorks2012 , tabel ProductVendor memiliki hubungan referensial dengan tabel Vendor. Kunci asing ProductVendor.BusinessEntityID mereferensikan kunci primer Vendor.BusinessEntityID.
Jika pernyataan DELETE dijalankan pada baris dalam tabel Vendor, dan tindakan ON DELETE CASCADE ditentukan untuk ProductVendor.BusinessEntityID, Mesin Database memeriksa satu atau beberapa baris dependen dalam tabel ProductVendor. Jika ada, baris dependen dalam tabel ProductVendor dihapus, selain baris yang dirujuk dalam tabel Vendor.
Sebaliknya, jika TIDAK ADA TINDAKAN yang ditentukan, Mesin Database menimbulkan kesalahan dan mengembalikan tindakan penghapusan pada baris Vendor ketika setidaknya ada satu baris dalam tabel ProductVendor yang mereferensikannya.
Jangan tentukan CASCADE jika tabel akan disertakan dalam publikasi gabungan yang menggunakan rekaman logis. Untuk informasi selengkapnya tentang rekaman logika, lihat Perubahan Grup ke Baris Terkait dengan Rekaman Logis.
ON UPDATE { NO ACTION }
Menentukan tindakan apa yang terjadi pada baris dalam tabel yang dibuat saat baris tersebut memiliki hubungan referensial dan baris yang direferensikan diperbarui dalam tabel induk. Ketika TIDAK ADA TINDAKAN yang ditentukan, Mesin Database menimbulkan kesalahan dan mengembalikan tindakan pembaruan pada baris Vendor jika setidaknya ada satu baris dalam tabel ProductVendor yang mereferensikannya.
BUKAN UNTUK REPLIKASI
Berlaku untuk: SQL Server 2008 dan yang lebih baru.
Dapat ditentukan untuk batasan KUNCI ASING dan batasan CHECK. Jika klausa ini ditentukan untuk batasan, batasan tidak diberlakukan saat agen replikasi melakukan operasi sisipkan, perbarui, atau hapus.
CHECK
Adalah batasan yang memberlakukan integritas domain dengan membatasi kemungkinan nilai yang dapat dimasukkan ke dalam kolom atau kolom. Batasan CHECK pada kolom komputasi juga harus ditandai PERSISTED.
logical_expression
Adalah ekspresi logis yang mengembalikan TRUE atau FALSE. Ekspresi tidak boleh berisi referensi ke jenis data alias.
| ON { partition_scheme_name(partition_column_name) grup file| "default"}
Berlaku untuk: SQL Server 2008 dan yang lebih baru.
Menentukan lokasi penyimpanan indeks yang dibuat untuk batasan. Jika partition_scheme_name ditentukan, indeks dipartisi dan partisi dipetakan ke grup file yang ditentukan oleh partition_scheme_name. Jika grup file ditentukan, indeks dibuat dalam grup file bernama. Jika "default" ditentukan atau jika ON tidak ditentukan sama sekali, indeks dibuat dalam grup file yang sama dengan tabel. Jika ON ditentukan ketika indeks berkluster ditambahkan untuk batasan KUNCI PRIMER atau UNIK, seluruh tabel dipindahkan ke grup file yang ditentukan saat indeks berkluster dibuat.
Catatan
Dalam konteks ini, defaultnya bukan kata kunci. Ini adalah pengidentifikasi untuk grup file default dan harus dibatasi, seperti dalam ON "default" atau ON [default]. Jika "default" ditentukan, opsi QUOTED_IDENTIFIER harus AKTIF untuk sesi saat ini. Ini adalah pengaturan default. Untuk informasi selengkapnya, lihat MENGATUR QUOTED_IDENTIFIER (SQL Bertransaksi).
Keterangan
Setiap KUNCI PRIMER dan batasan UNIK menghasilkan indeks. Jumlah batasan UNIQUE dan PRIMARY KEY tidak dapat menyebabkan jumlah indeks pada tabel melebihi 999 indeks non-kluster dan 1 indeks berkluster.
