Batasan unik dan batasan pemeriksaan
Berlaku untuk: SQL ServerAzure SQL Database Azure 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.
Tugas terkait
Tugas | 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 |