Batasan unik dan batasan pemeriksaan

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

UNIQUE batasan dan CHECK batasan adalah dua jenis batasan yang dapat digunakan untuk memberlakukan integritas data dalam tabel SQL Server. Ini adalah objek database penting.

Artikel ini berisi bagian berikut.

Batasan UNIK

Batasan adalah aturan yang diterapkan Mesin Database SQL Server untuk Anda. Misalnya, Anda dapat menggunakan UNIQUE batasan untuk memastikan bahwa tidak ada nilai duplikat yang dimasukkan dalam kolom tertentu yang tidak berpartisipasi dalam kunci primer. UNIQUE Meskipun batasan dan PRIMARY KEY batasan memberlakukan keunikan, gunakan UNIQUE batasan alih-alih batasan PRIMARY KEY saat Anda ingin menerapkan keunikan kolom (atau kombinasi kolom) yang bukan kunci utama.

Tidak seperti PRIMARY KEY batasan, UNIQUE batasan memungkinkan nilai NULL. Namun, seperti nilai apa pun yang UNIQUE berpartisipasi dalam batasan, hanya satu nilai null yang diizinkan per kolom. Batasan UNIQUE dapat dirujuk oleh FOREIGN KEY batasan.

UNIQUE Saat batasan ditambahkan ke kolom atau kolom yang ada dalam tabel, secara default, Mesin Database memeriksa data yang ada di kolom untuk memastikan semua nilai unik. UNIQUE Jika batasan ditambahkan ke kolom yang memiliki nilai duplikat, Mesin Database mengembalikan kesalahan dan tidak menambahkan batasan.

Mesin Database secara otomatis membuat UNIQUE indeks untuk memberlakukan persyaratan keunikan batasan UNIQUE . Oleh karena itu, jika upaya untuk menyisipkan baris duplikat dibuat, Mesin Database mengembalikan pesan kesalahan yang menyatakan UNIQUE batasan dilanggar, dan tidak menambahkan baris ke tabel. Kecuali indeks terkluster ditentukan secara eksplisit, indeks unik dan tidak terkluster dibuat secara default untuk memberlakukan UNIQUE batasan.

Batasan CHECK

CHECK batasan memberlakukan integritas domain dengan membatasi nilai yang diterima oleh satu atau beberapa kolom. Anda dapat membuat CHECK batasan dengan ekspresi logis (Boolean) apa pun yang mengembalikan TRUE atau FALSE berdasarkan operator logis. Misalnya, rentang nilai untuk salary kolom dapat dibatasi dengan membuat CHECK batasan yang hanya memungkinkan data yang berkisar dari $15.000 hingga $100.000. Ini mencegah gaji dimasukkan di luar kisaran gaji reguler. Ekspresi logis adalah sebagai berikut: salary >= 15000 AND salary <= 100000.

Anda dapat menerapkan beberapa CHECK batasan ke satu kolom. Anda juga dapat menerapkan satu CHECK batasan ke beberapa kolom dengan membuatnya di tingkat tabel. Misalnya, batasan beberapa kolom CHECK dapat digunakan untuk mengonfirmasi bahwa baris apa pun dengan country_region nilai USA kolom juga memiliki nilai dua karakter dalam state kolom. Ini memungkinkan beberapa kondisi untuk diperiksa di satu lokasi.

CHECK batasan mirip FOREIGN KEY dengan batasan di mana mereka mengontrol nilai yang dimasukkan ke dalam kolom. Perbedaannya adalah bagaimana nilai menentukan nilai mana yang valid: FOREIGN KEY batasan mendapatkan daftar nilai yang valid dari tabel lain, sementara CHECK batasan menentukan nilai yang valid dari ekspresi logis.

Perhatian

Batasan yang mencakup konversi jenis data implisit atau eksplisit dapat menyebabkan operasi tertentu gagal. Misalnya, batasan seperti yang ditentukan pada tabel yang merupakan sumber pengalihan partisi dapat menyebabkan ALTER TABLE...SWITCH operasi gagal. Hindari konversi jenis data dalam definisi batasan.

Batasan batasan CHECK

CHECK batasan menolak nilai yang mengevaluasi ke FALSE. Karena nilai null dievaluasi ke UNKNOWN, kehadirannya dalam ekspresi mungkin mengambil alih batasan. Misalnya, Anda menempatkan batasan pada kolom int yang menentukan yang MyColumn hanya dapat berisi nilai 10 (MyColumn=10).MyColumn Jika Anda menyisipkan nilai NULL ke dalam MyColumn, Mesin Database menyisipkan NULL dan tidak mengembalikan kesalahan.

CHECK Batasan kembali TRUE ketika kondisi yang dicentang bukan FALSE untuk baris apa pun dalam tabel. Batasan CHECK berfungsi di tingkat baris. Jika tabel yang dibuat tidak memiliki baris apa pun, batasan apa pun CHECK pada tabel ini dianggap valid. Situasi ini dapat menghasilkan hasil yang tidak terduga, seperti dalam contoh berikut.

CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO

CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
    DECLARE @retval INT;
    SELECT @retval = COUNT(*)
    FROM CheckTbl;

    RETURN @retval;
END;
GO

ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO

Batasan CHECK yang ditambahkan menentukan bahwa harus ada setidaknya satu baris dalam tabel CheckTbl. Namun, karena tidak ada baris dalam tabel untuk memeriksa kondisi batasan ini, ALTER TABLE pernyataan berhasil.

CHECK batasan tidak divalidasi selama DELETE pernyataan. Oleh karena itu, menjalankan DELETE pernyataan pada tabel dengan jenis batasan pemeriksaan tertentu dapat menghasilkan hasil yang tidak terduga. Misalnya, pertimbangkan pernyataan berikut yang dijalankan pada tabel CheckTbl.

INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;

Pernyataan DELETE berhasil, meskipun CHECK batasan menentukan bahwa tabel CheckTbl harus memiliki setidaknya 1 baris.

Catatan

Jika tabel diterbitkan untuk replikasi, Anda harus membuat perubahan skema menggunakan pernyataan Transact-SQL ALTER TABLE atau SQL Server Management Objects (SMO). Saat perubahan skema dilakukan menggunakan Perancang Tabel atau Perancang Diagram Database, ia mencoba untuk menghilangkan dan membuat ulang tabel. Anda tidak dapat menghilangkan objek yang diterbitkan, oleh karena itu perubahan skema akan gagal.

Task Artikel
Menjelaskan cara membuat batasan unik. Membuat batasan Unik
Menjelaskan cara mengubah batasan unik. Ubah Batasan Unik
Menjelaskan cara menghapus batasan unik. Hapus Batasan Unik
Menjelaskan cara membuat batasan pemeriksaan. Membuat Batasan Pemeriksaan
Menjelaskan cara menonaktifkan batasan pemeriksaan saat agen replikasi menyisipkan atau memperbarui data dalam tabel Anda. Nonaktifkan Periksa Batasan untuk Replikasi
Menjelaskan cara menonaktifkan batasan pemeriksaan saat data ditambahkan, diperbarui, atau dihapus dari tabel. Nonaktifkan Periksa Batasan dengan Pernyataan INSERT dan UPDATE
Menjelaskan cara mengubah ekspresi batasan atau opsi yang mengaktifkan atau menonaktifkan batasan untuk kondisi tertentu. Ubah Batasan Pemeriksaan
Menjelaskan cara menghapus batasan pemeriksaan. Hapus Batasan Pemeriksaan
Menjelaskan cara menampilkan properti batasan pemeriksaan. Batasan Unik dan Periksa Batasan