Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 adalah aturan yang diterapkan Mesin Database SQL Server untuk Anda. Misalnya, Anda dapat menggunakan batasan UNIK untuk memastikan bahwa tidak ada nilai duplikat yang dimasukkan dalam kolom tertentu yang tidak berpartisipasi dalam kunci primer. Meskipun batasan UNIK dan batasan KUNCI PRIMER memberlakukan keunikan, gunakan batasan UNIK alih-alih batasan KUNCI PRIMER saat Anda ingin menerapkan keunikan kolom, atau kombinasi kolom, itu bukan kunci utama.
Tidak seperti batasan PRIMARY KEY, batasan UNIQUE memungkinkan nilai NULL. Namun, seperti nilai apa pun yang berpartisipasi dalam batasan UNIK, hanya satu nilai null yang diizinkan per kolom. Batasan UNIQUE dapat dirujuk oleh batasan FOREIGN KEY.
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 UNIK untuk memberlakukan persyaratan keunikan batasan UNIK. Oleh karena itu, jika upaya untuk menyisipkan baris duplikat dibuat, Mesin Database mengembalikan pesan kesalahan yang menyatakan batasan UNIK telah dilanggar dan tidak menambahkan baris ke tabel. Kecuali indeks berkluster ditentukan secara eksplisit, indeks nonclustered unik dibuat secara default untuk menerapkan batasan UNIK.
Kendala Pemeriksaan
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 antara $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 bisa menerapkan beberapa batasan CHECK ke satu kolom. Anda juga dapat menerapkan batasan CHECK tunggal ke beberapa kolom dengan membuatnya di tingkat tabel. Misalnya, batasan CHECK beberapa kolom dapat digunakan untuk mengonfirmasi bahwa baris apa pun 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 KUNCI ASING karena mereka mengontrol nilai yang dimasukkan ke dalam kolom. Perbedaannya terletak pada cara mereka menentukan nilai mana yang valid: Batasan kunci asing mendapatkan daftar nilai yang valid dari tabel lain, sedangkan batasan CHECK menentukan nilai yang valid dari ekspresi logika.
Perhatian
Batasan yang mencakup konversi jenis data implisit atau eksplisit dapat menyebabkan operasi tertentu gagal. Misalnya, batasan seperti yang didefinisikan 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 dievaluasi menjadi SALAH. Karena nilai null dievaluasi ke UNKNOWN, kehadirannya dalam ekspresi dapat mengambil alih batasan. Misalnya, Anda menempatkan batasan pada int kolom MyColumn 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 pada 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 saat menjalankan 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 CHECK batasan menentukan bahwa tabel CheckTbl harus memiliki setidaknya 1 baris.
Tugas Terkait
Nota
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 | 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 menampilkan properti batasan pemeriksaan. | Batasan Unik dan Periksa Batasan |