ALTER TABLE table_constraint (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceWarehouse di Microsoft Fabric

Menentukan properti KUNCI PRIMER, UNIK, KUNCI ASING, batasan CHECK, atau definisi DEFAULT yang ditambahkan ke tabel dengan menggunakan ALTER TABLE.

Konvensi sintaks transact-SQL

Sintaksis

[ CONSTRAINT constraint_name ]   
{   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        (column [ ASC | DESC ] [ ,...n ] )  
        [ WITH FILLFACTOR = fillfactor   
        [ WITH ( <index_option>[ , ...n ] ) ]  
        [ ON { partition_scheme_name ( partition_column_name ... )  
          | filegroup | "default" } ]   
    | FOREIGN KEY   
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ NOT FOR REPLICATION ]   
    | CONNECTION
        ( { node_table TO node_table } 
          [ , {node_table TO node_table }]
          [ , ...n ]
        )
        [ ON DELETE { NO ACTION | CASCADE } ]
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | 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

CONSTRAINT
Menentukan awal definisi untuk batasan PRIMARY KEY, UNIQUE, FOREIGN KEY, atau CHECK, atau DEFAULT.

constraint_name
Adalah nama batasan. 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.

Kolom yang merupakan tipe data ntext, teks, varchar(max), nvarchar(max), varbinary(max), xml, atau gambar tidak dapat ditentukan sebagai kolom untuk indeks.

column
Adalah kolom atau daftar kolom yang ditentukan dalam tanda kurung yang digunakan dalam batasan baru.

[ ASC | DESC ]
Menentukan urutan pengurutan kolom atau kolom yang berpartisipasi dalam batasan tabel. Defaultnya adalah ASC.

DENGAN fillfactor FILLFACTOR =
Menentukan seberapa lengkap Mesin Database 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 klausa index_option ALTER TABLE.

ON { partition_scheme_name(partition_column_name) | filegroup| "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.

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.

REFERENSI KUNCI ASING
Adalah batasan yang memberikan integritas referensial untuk data di kolom. Batasan KUNCI ASING mengharuskan setiap nilai dalam kolom ada di kolom yang ditentukan dalam tabel yang dirujuk.

referenced_table_name
Adalah tabel yang dirujuk oleh batasan KUNCI ASING.

ref_column
Adalah kolom atau daftar kolom dalam tanda kurung yang direferensikan oleh batasan KUNCI ASING baru.

ON DELETE { NO ACTION | CASCADE | SET NULL | ATUR DEFAULT }
Menentukan tindakan apa yang terjadi pada baris dalam tabel yang diubah, jika baris tersebut memiliki hubungan referensial dan baris yang direferensikan dihapus dari tabel induk. Defaultnya adalah NO ACTION.

TIDAK ADA TINDAKAN
Mesin Database SQL Server 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.

SET NULL
Semua nilai yang membentuk kunci asing diatur ke NULL saat baris terkait dalam tabel induk dihapus. Agar batasan ini dijalankan, kolom kunci asing harus dapat diubah ke null.

ATUR DEFAULT
Semua nilai yang terdiri dari kunci asing diatur ke nilai defaultnya saat baris terkait dalam tabel induk dihapus. Agar batasan ini dijalankan, semua kolom kunci asing harus memiliki definisi default. Jika kolom dapat diubah ke null dan tidak ada nilai default eksplisit yang ditetapkan, NULL menjadi nilai default implisit kolom.

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 DELETE CASCADE tidak dapat ditentukan jika ALIH-ALIH pemicu ON DELETE sudah ada pada tabel yang sedang diubah.

Misalnya, dalam database, tabel ProductVendor memiliki hubungan referensial dengan tabel Vendor.AdventureWorks2022 Kunci asing ProductVendor.VendorID mereferensikan kunci primer Vendor.VendorID .

Jika pernyataan DELETE dijalankan pada baris dalam tabel Vendor dan tindakan ON DELETE CASCADE ditentukan untuk ProductVendor.VendorID, Mesin Database memeriksa satu atau beberapa baris dependen dalam tabel ProductVendor. Jika ada, baris dependen dalam tabel ProductVendor akan 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.

ON UPDATE { NO ACTION | CASCADE | SET NULL | ATUR DEFAULT }
Menentukan tindakan apa yang terjadi pada baris dalam tabel yang diubah ketika baris tersebut memiliki hubungan referensial dan baris yang direferensikan diperbarui dalam tabel induk. Defaultnya adalah NO ACTION.

TIDAK ADA TINDAKAN
Mesin Database menimbulkan kesalahan, dan tindakan pembaruan pada baris dalam tabel induk digulung balik.

CASCADE
Baris terkait diperbarui dalam tabel referensi saat baris tersebut diperbarui dalam tabel induk.

SET NULL
Semua nilai yang membentuk kunci asing diatur ke NULL saat baris terkait dalam tabel induk diperbarui. Agar batasan ini dijalankan, kolom kunci asing harus dapat diubah ke null.

ATUR DEFAULT
Semua nilai yang membentuk kunci asing diatur ke nilai defaultnya saat baris terkait dalam tabel induk diperbarui. Agar batasan ini dijalankan, semua kolom kunci asing harus memiliki definisi default. Jika kolom dapat diubah ke null, dan tidak ada nilai default eksplisit yang ditetapkan, NULL menjadi nilai default implisit kolom.

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 CASCADE, SET NULL, atau SET DEFAULT tidak dapat ditentukan jika PEMicu ALIH-ALIH ON UPDATE sudah ada pada tabel yang sedang diubah.

Misalnya, dalam database, tabel ProductVendor memiliki hubungan referensial dengan tabel Vendor.AdventureWorks2022 Kunci asing ProductVendor.VendorID mereferensikan kunci primer Vendor.VendorID .

Jika pernyataan UPDATE dijalankan pada baris dalam tabel Vendor dan tindakan ON UPDATE CASCADE ditentukan untuk ProductVendor.VendorID, Mesin Database memeriksa satu atau beberapa baris dependen dalam tabel ProductVendor. Jika ada, baris dependen dalam tabel ProductVendor akan diperbarui, serta baris yang dirujuk dalam tabel Vendor .

Sebaliknya, jika TIDAK ADA TINDAKAN yang ditentukan, Mesin Database menimbulkan kesalahan dan mengembalikan tindakan pembaruan pada baris Vendor ketika 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.

KONEKSI Menentukan pasangan tabel simpul yang batasan tepi yang diberikan diizinkan untuk tersambung. ON DELETE menentukan apa yang terjadi pada baris dalam tabel edge, ketika simpul yang tersambung melalui tepi dalam tabel tepi ini dihapus.

DEFAULT
Menentukan nilai default untuk kolom. Definisi DEFAULT dapat digunakan untuk menyediakan nilai untuk kolom baru di baris data yang sudah ada. Definisi DEFAULT tidak dapat ditambahkan ke kolom yang memiliki jenis data tanda waktu, properti IDENTITY, definisi DEFAULT yang ada, atau default terikat. Jika kolom memiliki default yang sudah ada, default harus dihilangkan sebelum default baru dapat ditambahkan. Jika nilai default ditentukan untuk kolom jenis yang ditentukan pengguna, jenis tersebut harus mendukung konversi implisit dari constant_expression ke jenis yang ditentukan pengguna. Untuk mempertahankan kompatibilitas dengan versi SQL Server yang lebih lama, nama batasan dapat ditetapkan ke DEFAULT.

constant_expression
Adalah nilai harfiah, NULL, atau fungsi sistem yang digunakan sebagai nilai kolom default. Jika constant_expression digunakan bersama dengan kolom yang didefinisikan sebagai jenis yang ditentukan pengguna Microsoft .NET Framework, implementasi jenis tersebut harus mendukung konversi implisit dari constant_expression ke jenis yang ditentukan pengguna.

Kolom FOR
Menentukan kolom yang terkait dengan definisi DEFAULT tingkat tabel.

DENGAN NILAI
Saat menambahkan kolom DAN batasan DEFAULT, jika kolom mengizinkan NULLS menggunakan WITH VALUES akan, untuk baris yang sudah ada, atur nilai kolom baru ke nilai yang diberikan dalam constant_expression DEFAULT. Jika kolom yang ditambahkan tidak mengizinkan NULLS, untuk baris yang ada, nilai kolom akan selalu diatur ke nilai yang diberikan dalam ekspresi konstanta DEFAULT. Mulai SQL Server 2012 ini mungkin merupakan operasi meta data adding-not-null-columns-as-an-online-operation. Jika ini digunakan ketika kolom terkait tidak juga ditambahkan, maka kolom tersebut tidak berpengaruh.

CHECK
Adalah batasan yang memberlakukan integritas domain dengan membatasi kemungkinan nilai yang dapat dimasukkan ke dalam kolom atau kolom.

logical_expression
Adalah ekspresi logis yang digunakan dalam batasan CHECK dan mengembalikan TRUE atau FALSE. logical_expression digunakan dengan batasan CHECK tidak dapat mereferensikan tabel lain tetapi dapat mereferensikan kolom lain dalam tabel yang sama untuk baris yang sama. Ekspresi tidak dapat mereferensikan jenis data alias.

Keterangan

Ketika batasan FOREIGN KEY atau CHECK ditambahkan, semua data yang ada diverifikasi untuk pelanggaran batasan kecuali opsi WITH NOCHECK ditentukan. Jika ada pelanggaran yang terjadi, ALTER TABLE gagal dan kesalahan dikembalikan. Saat KUNCI PRIMER atau batasan UNIK baru ditambahkan ke kolom yang sudah ada, data di kolom atau kolom harus unik. Jika nilai duplikat ditemukan, ALTER TABLE gagal. Opsi WITH NOCHECK tidak berpengaruh ketika batasan KUNCI PRIMER atau UNIK ditambahkan.

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. Batasan kunci asing tidak secara otomatis menghasilkan indeks. Namun, kolom kunci asing sering digunakan dalam kriteria gabungan dalam kueri dengan mencocokkan kolom atau kolom dalam batasan kunci asing dari satu tabel dengan kolom atau kolom kunci utama atau unik di tabel lain. Indeks pada kolom kunci asing memungkinkan Mesin Database menemukan data terkait dengan cepat dalam tabel kunci asing.

SQL Server 2022 (16.x) memperkenalkan operasi yang dapat dilanjutkan untuk menambahkan batasan tabel untuk kunci primer dan batasan kunci unik. Untuk informasi selengkapnya tentang mengaktifkan dan menggunakan operasi yang dapat dilanjutkan ALTER TABLE ADD CONSTRAINT , lihat Menambahkan batasan tabel yang dapat dilanjutkan.

Contoh

Misalnya, lihat ALTER TABLE (Transact-SQL).

Langkah berikutnya