Batasan unik dan batasan pemeriksaan

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

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. Meskipun batasan UNIQUE dan batasan PRIMARY KEY sama-sama menegakkan keunikan, gunakan batasan UNIQUE alih-alih batasan PRIMARY KEY saat Anda ingin menegakkan keunikan pada kolom (atau kombinasi kolom) yang bukan kunci primer.

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 multikolom CHECK dapat digunakan untuk mengonfirmasi bahwa setiap baris dengan nilai kolom country_region berupa USA juga memiliki nilai dua karakter di kolom state. 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.

Caution

Batasan yang mencakup konversi jenis data implisit atau eksplisit dapat menyebabkan operasi tertentu gagal. Misalnya, batasan seperti itu yang didefinisikan pada tabel yang menjadi sumber untuk peralihan partisi dapat menyebabkan operasi ALTER TABLE...SWITCH gagal. Hindari konversi jenis data dalam definisi batasan.

Batasan batasan CHECK

CHECK batasan menolak nilai yang bernilai FALSE. Karena nilai null dievaluasikan menjadi UNKNOWN, keberadaannya dalam ekspresi mungkin menyebabkan batasan diabaikan. Misalnya, Anda menempatkan batasan pada kolom int yang menentukan yang MyColumn hanya dapat berisi nilai 10 (MyColumn).MyColumn=10 Jika Anda menyisipkan nilai NULL ke dalam MyColumn, Mesin Database menyisipkan NULL dan tidak mengembalikan kesalahan.

CHECK Constraint mengembalikan TRUE ketika kondisi yang diperiksanya tidak bernilai FALSE untuk baris mana pun di 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 dalam pernyataan DELETE. 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.

Note

Jika tabel diterbitkan untuk replikasi, Anda harus membuat perubahan skema menggunakan pernyataan ALTER TABLE Transact-SQL 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 Article
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. Menonaktifkan Konstrain CHECK menggunakan 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