Bagikan melalui


ALTER TABLE table_constraint (Transact-SQL)

Aplikasi ke:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceWarehouse di Microsoft Fabric database SQL dalam Microsoft Fabric

Gunakan ALTER TABLE untuk menentukan properti PRIMARY KEY, UNIQUE, FOREIGN KEY, batasan CHECK, atau definisi DEFAULT yang Anda tambahkan ke tabel dengan menggunakan ALTER TABLE (Transact-SQL).

Transact-SQL konvensi sintaks

Syntax

[ 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 )  
}  

Arguments

CONSTRAINT

Menentukan awal definisi untuk PRIMARY KEYbatasan , , UNIQUE, FOREIGN KEYatau CHECK , atau DEFAULT.

nama_kendala

Nama batasan. Nama batasan harus mengikuti aturan untuk pengidentifikasi, kecuali bahwa nama tidak dapat dimulai dengan tanda angka (#). Jika Anda tidak menyediakan constraint_name, sistem menetapkan nama yang dihasilkan ke batasan.

KUNCI PRIMER

Batasan yang memberlakukan integritas entitas untuk kolom atau kolom tertentu dengan menggunakan indeks unik. Anda hanya dapat membuat satu PRIMARY KEY batasan untuk setiap tabel.

UNIQUE

Batasan yang menyediakan integritas entitas untuk kolom atau kolom tertentu dengan menggunakan indeks unik.

BERKLUSTER | NONCLUSTERED

Menentukan bahwa indeks terkluster atau non-kluster dibuat untuk PRIMARY KEY atau UNIQUE batasan. PRIMARY KEY batasan default ke CLUSTERED. UNIQUE batasan default ke NONCLUSTERED.

Jika batasan atau indeks berkluster sudah ada pada tabel, Anda tidak dapat menentukan CLUSTERED. Jika batasan atau indeks berkluster sudah ada pada tabel, PRIMARY KEY batasan default ke NONCLUSTERED.

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

kolom

Kolom atau daftar kolom yang ditentukan dalam tanda kurung yang Anda gunakan dalam batasan baru.

[ ASC | DESC ]

Menentukan urutan pengurutan kolom atau kolom yang berpartisipasi dalam batasan tabel. Defaultnya adalah urutan urutan naik (ASC).

DENGAN FILLFACTOR = fillfactor

Menentukan seberapa lengkap Database Engine harus membuat setiap halaman indeks digunakan untuk menyimpan data indeks. Nilai fillfactor yang ditentukan pengguna bisa dari 1 hingga 100. Jika Anda tidak menentukan nilai, defaultnya adalah 0.

Untuk kompatibilitas mundur, dokumentasi ini disertakan WITH FILLFACTOR = <fillfactor> sebagai satu-satunya opsi indeks yang berlaku untuk PRIMARY KEY atau UNIQUE batasan. Sintaks ini tidak akan didokumenkan dalam rilis mendatang. Anda dapat menentukan opsi indeks lain dalam klausa index_option .ALTER TABLE

AKTIF { partition_scheme_name(partition_column_name) | grup file| "default" }

Aplikasi ke: SQL Server 2008 (10.0.x) dan versi yang lebih baru.

Menentukan lokasi penyimpanan indeks yang dibuat untuk batasan. Jika Anda menentukan partition_scheme_name, indeks dipartisi dan partisi dipetakan ke grup file yang partition_scheme_name tentukan. Jika Anda menentukan grup file, indeks dibuat di grup file bernama. Jika Anda menentukan "default" atau jika Anda tidak menentukan ON sama sekali, indeks dibuat dalam grup file yang sama dengan tabel. Jika Anda menentukan ON kapan Anda menambahkan indeks berkluster untuk PRIMARY KEY atau UNIQUE batasan, 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 Anda menentukan "default", QUOTED_IDENTIFIER opsi harus ON untuk sesi saat ini. Ini adalah pengaturan default.

REFERENSI KUNCI ASING

Batasan yang menyediakan integritas referensial untuk data di kolom. FOREIGN KEY batasan mengharuskan setiap nilai dalam kolom ada di kolom yang ditentukan dalam tabel yang dirujuk.

referenced_table_name

Tabel yang dirujuk FOREIGN KEY oleh batasan.

ref_column

Kolom atau daftar kolom dalam tanda kurung yang direferensikan oleh batasan baru FOREIGN KEY .

ON DELETE { NO ACTION | CASCADE | SET NULL | ATUR DEFAULT }

Menentukan tindakan apa yang terjadi pada baris dalam tabel yang Anda ubah, jika baris tersebut memiliki hubungan referensial dan Anda menghapus baris yang dirujuk dari tabel induk. Defaultnya adalah NO ACTION.

TIDAK ADA TINDAKAN

Mesin Database SQL Server menimbulkan kesalahan dan mengembalikan tindakan hapus pada baris dalam tabel induk.

CASCADE

Menghapus baris terkait dari tabel referensi jika Anda menghapus baris tersebut dari tabel induk.

TETAPKAN NULL

Mengatur semua nilai yang membentuk kunci NULL asing saat Anda menghapus baris terkait dalam tabel induk. Agar batasan ini dijalankan, kolom kunci asing harus dapat diubah ke null.

ATUR DEFAULT

Mengatur semua nilai yang terdiri dari kunci asing ke nilai defaultnya saat Anda menghapus baris terkait dalam tabel induk. 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 apakah tabel disertakan dalam publikasi gabungan yang menggunakan rekaman logis. Untuk informasi selengkapnya tentang rekaman logis, lihat Perubahan Grup pada Baris Terkait dengan Rekaman Logis.

Anda tidak dapat menentukan ON DELETE CASCADE apakah pemicu ON DELETEINSTEAD OF sudah ada pada tabel yang Anda ubah.

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

Jika Anda menjalankan pernyataan DELETE pada baris dalam tabel Vendor dan menentukan tindakan ON DELETE CASCADE untuk ProductVendor.VendorID, Database Engine memeriksa satu atau beberapa baris dependen dalam tabel ProductVendor. Jika ada, baris dependen dalam ProductVendor tabel akan dihapus, selain baris yang dirujuk dalam Vendor tabel.

Sebaliknya, jika Anda menentukan NO ACTION, Database Engine menimbulkan kesalahan dan mengembalikan tindakan penghapusan pada baris Vendor saat 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 Anda ubah saat baris tersebut memiliki hubungan referensial dan Anda memperbarui baris yang dirujuk dalam tabel induk. Defaultnya adalah NO ACTION.

TIDAK ADA TINDAKAN

Database Engine 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.

TETAPKAN NULL

Mengatur semua nilai yang membentuk kunci asing menjadi NULL saat Anda memperbarui baris yang sesuai dalam tabel induk. 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 apakah tabel 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 didefinisikan jika pemicu INSTEAD OFON UPDATE sudah ada pada tabel yang sedang diubah.

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

Jika Anda menjalankan pernyataan UPDATE pada baris dalam tabel Vendor dan menentukan tindakan ON UPDATE CASCADE untuk ProductVendor.VendorID, Database Engine memeriksa satu atau beberapa baris dependen dalam tabel ProductVendor. Jika ada, baris dependen dalam tabel diperbarui ProductVendor , serta baris yang dirujuk dalam Vendor tabel.

Sebaliknya, jika Anda menentukan NO ACTION, Database Engine menimbulkan kesalahan dan mengembalikan tindakan pembaruan pada baris Vendor saat setidaknya ada satu baris dalam tabel ProductVendor yang mereferensikannya.

BUKAN UNTUK REPLIKASI

Aplikasi ke: SQL Server 2008 (10.0.x) dan versi yang lebih baru.

Jika Anda menentukan klausul ini untuk batasan, agen replikasi tidak memberlakukan batasan saat mereka melakukan operasi tulis. Anda dapat menentukan klausa ini untuk FOREIGN KEY batasan dan CHECK batasan.

CONNECTION

Menentukan pasangan tabel simpul yang batasan tepi yang diberikan diizinkan untuk tersambung. ON DELETE menentukan apa yang terjadi pada baris dalam tabel edge saat simpul yang disambungkan tepi dihapus.

DEFAULT

Menentukan nilai default untuk kolom. Gunakan DEFAULT definisi untuk menyediakan nilai untuk kolom baru di baris data yang sudah ada. Anda tidak dapat menambahkan DEFAULT definisi ke kolom yang memiliki jenis data tanda waktu , IDENTITY properti, definisi yang sudah ada DEFAULT , atau default terikat. Jika kolom memiliki default yang sudah ada, Anda harus menghilangkan default sebelum Anda bisa menambahkan default baru. Jika Anda menentukan nilai default 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, Anda dapat menetapkan nama batasan ke DEFAULT.

constant_expression

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

Kolom FOR

Menentukan kolom yang terkait dengan definisi tingkat DEFAULT tabel.

DENGAN NILAI

  • Saat Anda menambahkan kolom dan DEFAULT batasan, jika kolom mengizinkan null, menggunakan WITH VALUES atur nilai kolom baru untuk baris yang sudah ada ke nilai yang diberikan dalam DEFAULTconstant_expression.

  • Jika kolom yang Anda tambahkan tidak memperbolehkan null, nilai kolom untuk baris yang ada selalu diatur ke nilai yang diberikan dalam DEFAULTekspresi konstanta.

Pada SQL Server 2012 dan versi yang lebih baru, operasi ini dapat menjadi operasi metadata tambahkan-tidak-null-columns-as-an-online-operation.

Jika Anda menggunakan WITH VALUES saat kolom terkait tidak juga ditambahkan, kolom tersebut tidak berpengaruh.

CHECK

Batasan yang memberlakukan integritas domain dengan membatasi kemungkinan nilai yang dapat dimasukkan ke dalam kolom atau kolom.

logical_expression

Ekspresi logis yang CHECK digunakan dalam batasan yang mengembalikan TRUE atau FALSE. logical_expression digunakan dengan CHECK batasan 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.

Remarks

Saat Anda menambahkan FOREIGN KEY atau CHECK membatasi, sistem memeriksa semua data yang ada untuk pelanggaran batasan kecuali Anda menentukan WITH NOCHECK opsi . Jika ada pelanggaran yang terjadi, ALTER TABLE gagal dan mengembalikan kesalahan. Saat Anda menambahkan baru PRIMARY KEY atau UNIQUE batasan ke kolom yang sudah ada, data di kolom atau kolom harus unik. Jika nilai duplikat ditemukan, ALTER TABLE gagal. Opsi WITH NOCHECK ini tidak berpengaruh saat Anda menambahkan PRIMARY KEY atau UNIQUE membatasi.

Masing-masing PRIMARY KEY dan UNIQUE batasan menghasilkan indeks. Jumlah UNIQUE dan PRIMARY KEY batasan 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, Anda sering menggunakan kolom kunci asing 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 Database Engine menemukan data terkait dengan cepat dalam tabel kunci asing.

Pada SQL Server 2022 (16.x) dan versi yang lebih baru, operasi yang dapat dilanjutkan mendukung penambahan 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.

Gudang di Microsoft Fabric mendukung batasan kolom ADD atau DROPPRIMARY KEY, UNIQUE, dan FOREIGN_KEY, tetapi hanya jika Anda menentukan opsi NOT ENFORCED. Gudang di Microsoft Fabric memblokir semua operasi ALTER TABLE lainnya.

Examples

Misalnya, lihat ALTER TABLE (Transact-SQL).