ALTER TABLE computed_column_definition (Transact-SQL)
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Menentukan properti kolom komputasi yang ditambahkan ke tabel dengan menggunakan ALTER TABLE.
Sintaksis
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 (12.x) dan versi 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 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: harga AS biaya * qty. Contoh lain dengan operator bitwise: is_finalised AS is_checked | is_approved. Ekspresi dapat berupa nama kolom yang tidak terkomputasi, konstanta, fungsi, variabel, dan kombinasi apa pun yang terhubung oleh satu atau beberapa operator. Ekspresi tidak dapat 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 KUNCI DEFAULT atau ASING atau dengan definisi batasan NOT NULL. Namun, jika nilai kolom komputasi didefinisikan 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 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 tabel yang dipartisi harus ditandai secara eksplisit PERSISTED. computed_column_expression harus deterministik ketika PERSISTED ditentukan.
NULL | BUKAN NULL
Menentukan apakah nilai null diizinkan 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 KUNCI PRIMER atau batasan 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.
BERKLUSTER | NONCLUSTERED
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 terkluster sudah ada pada tabel, KUNCI PRIMER membatasi default ke NONCLUSTERED.
WITH 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
MendokumenKAN DENGAN FILLFACTOR = fillfactor sebagai satu-satunya opsi indeks yang berlaku untuk batasan KUNCI PRIMER atau UNIK dipertahankan untuk kompatibilitas mundur, tetapi tidak akan didokumenkan dengan cara ini dalam rilis mendatang. Opsi indeks lain dapat ditentukan dalam klausul 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 KUNCI ASING 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 NO ACTION.
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 AdventureWorks2022
database, 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 logis, lihat Perubahan Grup pada 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 (10.0.x) 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.
AKTIF { partition_scheme_name(partition_column_name) | grup file| "default"}
Berlaku untuk: SQL Server 2008 (10.0.x) 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, default 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 SET QUOTED_IDENTIFIER (Transact-SQL).
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.
SET QUOTED_IDENTIFIER
harus AKTIF saat Anda membuat atau mengubah indeks pada kolom komputasi atau tampilan terindeks. Untuk informasi selengkapnya, lihat SET QUOTED_IDENTIFIER (Transact-SQL).