Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Wawasan tentang Batasan Unik SQL Server

Apakah batasan kunci unik itu?

Batasan unik adalah aturan yang membatasi entri kolom menjadi unik. Dengan kata lain, jenis batasan ini mencegah penyisipan duplikat ke dalam kolom. Batasan unik adalah salah satu instrumen untuk menegakkan integritas data dalam database SQL Server. Karena tabel hanya dapat memiliki satu kunci utama, Anda dapat menggunakan batasan unik untuk menerapkan keunikan kolom atau kombinasi kolom yang bukan merupakan kunci utama.

Membuat batasan unik pada kolom secara otomatis membuat indeks unik. Dengan cara ini SQL Server mengimplementasikan persyaratan integritas dari batasan unik. Oleh karena itu, ketika mencoba memasukkan nilai duplikat ke dalam kolom, di mana batasan unik ditentukan, Mesin Basis Data akan mendeteksi pelanggaran batasan unik dan mengeluarkan kesalahan yang sesuai. Akibatnya, baris dengan nilai duplikat tidak akan ditambahkan ke tabel.

Membuat batasan unik

Contoh kueri berikut membuat Siswa tabel dan batasan unik pada Login kolom agar tidak ada siswa dengan login yang sama.

CREATE TABLE Students (Login CHAR NOT NULL,CONSTRAINT AK_Student_Login UNIQUE (Login));GO

Jika Siswa tabel sudah ada, maka Anda dapat menggunakan kueri contoh berikut untuk membuat batasan unik.

ALTER TABLE StudentsTAMBAHKAN CONSTRAINT AK_Student_Login UNIQUE (Login);GO

Perhatikan bahwa saat Anda menambahkan batasan unik ke tabel yang ada, Mesin Database memverifikasi apakah kolom yang ditambahkan batasan menyertakan nilai duplikat. Jika ada nilai seperti itu, batasan tidak akan ditambahkan sehingga menghasilkan kesalahan.

Sekarang, untuk memverifikasi bahwa batasan unik telah benar-benar ditambahkan, jalankan pernyataan berikut:

EXEC sp_helpindex SiswaEXEC sp_helpconstraint Siswa

Inilah batasan yang kami buat:

Membuat batasan unik di SQL Server Management Studio

Katakanlah kita perlu mendefinisikan batasan unik pada Login kolom itu Siswa tabel.

1. Di Penjelajah Objek , klik kanan Siswa tabel dan klik Desain .

2. Klik kanan Perancang Tabel dan pilih Indeks/Kunci…

3. Di Indeks/Kunci jendela, klik Tambah .

4. Di bawah Umum bagian, klik Kolom lalu klik tombol elipsis. Di Kolom Indeks jendela, pilih kolom yang ingin Anda sertakan dalam batasan unik.

5. Di bawah Umum bagian, klik Ketik dan pilih Kunci Unik dari daftar tarik-turun.

6. Di bawah Identitas bagian, tentukan nama kendala (dalam kasus kami, AK_Student_Login ) dan klik Tutup untuk menyimpan batasan yang baru dibuat.

Sekarang, jika Anda pergi ke Siswa tabel di Object Explorer dan klik Indeks folder, Anda akan melihat bahwa tabel berisi kunci utama dan batasan unik AK_Student_Login .

Bagaimana batasan unik berbeda dari kunci utama?

Mirip dengan batasan unik, kunci utama juga digunakan untuk menegakkan integritas data dalam sebuah tabel. Tetapi tujuan utama dari kunci utama adalah untuk secara unik mengidentifikasi setiap catatan dalam tabel dan menerapkan hubungan yang tepat antara tabel dalam database. Kunci utama diperlukan di 99% tabel untuk memungkinkan akses yang tepat ke baris tabel. Hanya ada satu kunci utama per tabel yang ditentukan pada satu atau lebih dari satu kolom.

Batasan unik secara khusus digunakan untuk mencegah nilai duplikat dimasukkan ke dalam kolom. Mungkin ada beberapa kolom dengan batasan unik atau mungkin tidak ada batasan unik yang didefinisikan pada tabel sama sekali. Mereka tidak wajib untuk tabel sebagai lawan dari kunci utama.

Katakanlah, kita memiliki Siswa tabel yang berisi informasi pribadi tentang setiap mahasiswa di sebuah universitas. Tabel menyertakan StudentID kolom yang merupakan kunci utama dan menyimpan ID unik dari setiap siswa tertentu. Kolom kunci utama ini digunakan untuk mengidentifikasi secara unik setiap mahasiswa di sebuah universitas.

Pada saat yang sama, Siswa tabel memiliki kolom seperti Email , Nomor Jaminan Sosial , dan Masuk dan masing-masing kolom ini harus menyimpan nilai unik. Karena sudah ada satu kunci utama dalam tabel, kita akan menggunakan batasan unik sebagai gantinya untuk memaksakan keunikan pada kolom ini. Dengan demikian, sebuah tabel dapat memiliki banyak batasan unik dan hanya satu kunci utama.

Hal lain yang membedakan batasan unik dari kunci utama adalah bahwa kunci utama tidak mengizinkan NULL nilai dalam kolom, sedangkan kolom dengan batasan unik dapat menyertakan NULL nilai tetapi hanya satu karena SQL Server menafsirkan dua nilai NULL sebagai nilai yang sama.

Misalkan batasan unik dibuat di Email kolom Siswa meja. Mari kita coba menyisipkan dua baris keduanya dengan NULL s di Email bidang:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')GO

Kami mendapatkan pesan kesalahan berikut:

Nah, ini adalah perilaku yang dapat diprediksi, karena nilai duplikat, meskipun NULL, tidak diizinkan oleh batasan unik.

Batasan unik vs Indeks unik

Meskipun batasan unik dan indeks unik adalah dua entitas database tidak terkait yang sama sekali berbeda, mereka memiliki tujuan yang sama dan dampak yang sama pada kinerja SQL Server. Keduanya memastikan keunikan data dalam kolom.

Namun, berbeda dengan indeks unik, Anda tidak dapat menentukan opsi IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX , dan STATISTICS_NORECOMPUTE untuk batasan unik dalam pernyataan ALTER TABLE.

Saat Anda membuat batasan unik pada kolom, SQL Server secara otomatis membuat indeks unik pada kolom, begitulah cara fitur ini diterapkan di SQL Server.

Untuk menghapus indeks unik, Anda harus terlebih dahulu menghapus batasan unik yang sesuai dan ini akan secara otomatis menghapus indeks unik yang mendasarinya.

Pernyataan berikut akan menghapus AK_Student_Login kendala:

ALTER TABLE Siswa DROP CONSTRAINT AK_Student_Login; PERGI

Anda dapat melihatnya menjatuhkan AK_Student_Login batasan unik menghapus indeks yang sesuai.

Itu mudah, sekarang Anda dapat memasukkan nilai yang sama ke dalam Login kolom.

Menonaktifkan Batasan Unik

Ada opsi yang menonaktifkan batasan unik. Kueri berikut seharusnya menonaktifkan semua batasan tabel:

ALTER TABLE StudentsNOCHECK CONSTRAINT ALLGO

Setelah menjalankan kueri, sekarang mari kita coba menyisipkan rekaman duplikat:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')GO

Apa yang kami dapatkan adalah pesan pelanggaran batasan unik:

Jadi, tampaknya ALTER TABLE NOCHECK CONSTRAINT ALL GO tidak berfungsi untuk batasan unik di SQL Server.

Namun, ingat bahwa ada indeks unik di bawah kap setiap batasan unik, dan kita harus dapat menonaktifkan indeks unik. Dalam kasus kami, AK_Student_Email batasan unik telah membuat AK_Student_Email . yang sesuai indeks unik di Email kolom. Mari gunakan kueri berikut untuk menonaktifkan AK_Student_Email indeks unik terlebih dahulu.

ALTER INDEX AK_Student_Email ON StudentsDISABLE;

Kueri telah berhasil diselesaikan, jadi sekarang mari kita masukkan dua catatan dengan duplikat Email bidang ke dalam Siswa tabel.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')GO 
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')GO 

Berhasil! Catatan telah dimasukkan ke dalam tabel! Sekarang kita tahu cara mengatasi masalah "penonaktifan" ini dengan batasan unik.

Untuk mengaktifkan indeks, gunakan kueri berikut:

ALTER INDEX AK_Student_Email PADA StudentsREBUILD;

Kesimpulan

Kendala kunci yang unik memungkinkan DBA dan pengembang SQL untuk menerapkan dan mempertahankan keunikan data dalam kolom tabel, serta menerapkan persyaratan bisnis tertentu untuk integritas data. Pada dasarnya, tidak ada perbedaan substansial dalam perilaku antara batasan unik dan indeks unik, kecuali fakta bahwa batasan unik tidak dapat dinonaktifkan secara langsung dan opsi pembuatan indeks tertentu tidak tersedia untuk batasan unik dalam pernyataan ALTER TABLE.

Semoga artikel ini menarik. Anda dapat mengajukan pertanyaan, memberikan komentar dan saran mengenai artikel ini.

Lihat juga: PERIKSA Batasan di SQL Server


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menerapkan Pemformatan Bersyarat ke Angka di SQL Server menggunakan FORMAT()

  2. Apakah ada cara untuk mengulang variabel tabel di TSQL tanpa menggunakan kursor?

  3. SQL Query untuk mendapatkan hasil agregat dalam pemisah koma bersama dengan grup demi kolom di SQL Server

  4. SqlDependency tidak mengaktifkan acara OnChange saat kumpulan data diubah

  5. Cara menggunakan RANK() di SQL Server