Batasan Unik dan Batasan Pemeriksaan

Berlaku untuk: SQL Server (semua versi yang didukung) Azure SQL Database Azure SQL Managed Instance

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

Topik ini berisi bagian berikut.

Batasan UNIK

BATASAN CHECK

Tugas Terkait

Batasan UNIK

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

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

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

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

BATASAN CHECK

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

Anda bisa menerapkan beberapa batasan CHECK ke satu kolom. Anda juga bisa menerapkan satu batasan CHECK ke beberapa kolom dengan membuatnya di tingkat tabel. Misalnya, batasan CHECK beberapa kolom dapat digunakan untuk mengonfirmasi bahwa setiap baris dengan nilai kolom country_regionAS juga memiliki nilai dua karakter di kolom status . Ini memungkinkan beberapa kondisi untuk diperiksa di satu lokasi.

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

Perhatian

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

Batasan Batasan CHECK

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

Batasan CHECK mengembalikan TRUE saat kondisi pemeriksaannya bukan FALSE untuk baris apa pun dalam tabel. Batasan CHECK berfungsi di tingkat baris. Jika tabel yang baru saja dibuat tidak memiliki baris apa pun, batasan CHECK apa pun 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, pernyataan ALTER TABLE berhasil.

Batasan CHECK tidak divalidasi selama pernyataan DELETE. Oleh karena itu, menjalankan pernyataan DELETE 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 batasan CHECK menentukan bahwa tabel CheckTbl harus memiliki setidaknya 1 baris.

Tugas Terkait

Catatan

Jika tabel diterbitkan untuk replikasi, Anda harus membuat perubahan skema menggunakan pernyataan Transact-SQL ALTER TABLE atau SQL Server Management Objects (SMO). Ketika perubahan skema dilakukan menggunakan Desainer 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.

Tugas Topik
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 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 melihat properti batasan pemeriksaan. Batasan Unik dan Batasan Pemeriksaan