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

Kunci Utama di SQL Server

Di semua produk RDBMS utama, Kunci Utama dalam batasan SQL memiliki peran vital. Mereka mengidentifikasi catatan yang ada dalam tabel secara unik. Oleh karena itu, kita harus memilih server Primary Keys dengan hati-hati selama desain tabel untuk meningkatkan kinerja.

Dalam artikel ini, kita akan mempelajari apa itu batasan Kunci Utama. Selain itu, kita akan melihat cara membuat, memodifikasi, atau menghapus batasan Kunci Utama.

Kendala SQL Server

Di SQL Server, Batasan adalah aturan yang mengatur memasukkan data ke dalam kolom yang diperlukan. Kendala menegakkan keakuratan data dan bagaimana data tersebut sesuai dengan persyaratan bisnis. Juga, mereka membuat data dapat diandalkan untuk pengguna akhir. Itulah mengapa sangat penting untuk mengidentifikasi Kendala yang benar selama fase desain dari database atau skema tabel.

SQL Server mendukung Jenis kendala berikut ini untuk menegakkan integritas data:

Batasan Kunci Utama dibuat pada satu kolom atau kombinasi kolom untuk menegakkan keunikan catatan dan mengidentifikasi catatan lebih cepat. Kolom yang terlibat tidak boleh memiliki nilai NULL. Oleh karena itu, properti NOT NULL harus didefinisikan pada kolom.

Batasan Kunci Asing dibuat pada satu kolom atau kombinasi kolom untuk membuat hubungan antara dua tabel dan menerapkan data yang ada dalam satu tabel ke tabel lainnya. Idealnya, kolom tabel di mana kita perlu menerapkan data dengan batasan Kunci Asing merujuk ke tabel Sumber dengan Kunci Utama dalam SQL atau batasan Kunci Unik. Dengan kata lain, hanya record yang tersedia di tabel Sumber Batasan Utama atau Kunci Unik yang dapat dimasukkan atau diperbarui ke tabel Tujuan.

Batasan Kunci Unik dibuat pada satu kolom atau kombinasi kolom untuk menegakkan keunikan di seluruh data kolom. Mereka mirip dengan batasan Kunci Utama dengan satu perubahan. Perbedaan antara Kunci Utama dan Batasan Kunci Unik adalah bahwa yang terakhir dapat dibuat di Nullable kolom dan izinkan satu record nilai NULL di kolomnya.

Periksa Batasan dibuat pada satu kolom atau kombinasi kolom dengan membatasi nilai data yang diterima untuk kolom yang terlibat melalui ekspresi logika. Ada perbedaan antara Kunci Asing dan Batasan Periksa. Kunci Asing memberlakukan integritas data dengan memeriksa data dari Kunci Utama atau Unik tabel lain. Namun, Batasan Periksa melakukan ini dengan menggunakan ekspresi logika.

Sekarang, mari kita lihat Batasan Kunci Utama.

Kendala Kunci Utama

Batasan Kunci Utama memberlakukan keunikan pada satu kolom atau kombinasi kolom tanpa nilai NULL di dalam kolom yang terlibat.

Untuk menegakkan keunikan, SQL Server membuat indeks berkerumun unik pada kolom tempat Kunci Utama dibuat. Jika ada indeks berkerumun yang ada, SQL Server membuat indeks Non-tergugus Unik pada tabel untuk Kunci Utama.

Mari kita lihat bagaimana kita Membuat, Memodifikasi, Menjatuhkan, Menonaktifkan, atau Mengaktifkan Kunci Utama pada tabel menggunakan skrip T-SQL.

Buat Kunci Utama

Kita dapat membuat kunci utama pada tabel baik selama pembuatan tabel atau setelah itu. Sintaksnya sedikit berbeda untuk skenario ini.

Pembuatan Kunci Utama Selama Pembuatan Tabel

Sintaksnya di bawah ini:

CREATE TABLE SCHEMA_NAME.TABLE_NAME
( 
  COLUMN1 datatype [ NULL | NOT NULL ] PRIMARY KEY,
  COLUMN2 datatype [ NULL | NOT NULL ],
  ...
);

Mari buat tabel bernama Karyawan di Sumber Daya Manusia skema untuk tujuan pengujian dengan skrip di bawah ini:

CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL PRIMARY KEY,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);

Kami telah berhasil membuat HumanResources.Employeees tabel di AdventureWorks basis data:

Kita dapat melihat bahwa indeks berkerumun dibuat pada tabel yang cocok dengan nama Kunci Utama seperti yang disorot di atas.

Mari letakkan tabel menggunakan skrip di bawah ini dan coba lagi dengan sintaks baru.

DROP TABLE HumanResources.Employees

Untuk membuat Kunci Utama dalam SQL pada tabel dengan nama Kunci Utama yang ditentukan pengguna PK_Karyawan , gunakan sintaks di bawah ini:

CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY (Employee_Id)
);

Kami telah membuat HumanResources.Employees tabel dengan nama Kunci Utama PK_Karyawan :

Pembuatan Kunci Utama Setelah Pembuatan Tabel

Terkadang, pengembang atau DBA melupakan Kunci Utama dan membuat tabel tanpanya. Tetapi dimungkinkan untuk membuat kunci utama pada tabel yang ada.

Ayo tinggalkan HumanResources.Employee tabel dan buat ulang menggunakan skrip di bawah ini:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO

Ketika Anda berhasil menjalankan skrip ini, kita dapat melihat HumanResources.Employee tabel dibuat tanpa kunci atau indeks Utama:

Untuk membuat Kunci Utama bernama PK_Employee pada tabel ini, gunakan sintaks di bawah ini:

ALTER TABLE <schema_name>.<table_name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY ( <column_name> );

Eksekusi skrip ini membuat kunci Utama di tabel kami:

ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);

Pembuatan Kunci Utama pada Beberapa Kolom

Dalam contoh kami, kami membuat Kunci Utama pada kolom tunggal. Jika kita ingin membuat kunci utama pada beberapa kolom, kita memerlukan sintaks yang berbeda.

Untuk menambahkan beberapa kolom sebagai bagian dari Kunci Utama, kita hanya perlu menambahkan nilai yang dipisahkan koma dari nama kolom yang seharusnya menjadi bagian dari Kunci Utama.

Kunci Utama Selama Pembuatan Tabel

CREATE TABLE HumanResources.Employees
( First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY (First_Name, Last_Name)
);
GO

Kunci Utama Setelah Pembuatan Tabel

CREATE TABLE HumanResources.Employees
( First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO
ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (First_Name, Last_Name);
GO

Lepaskan Kunci Utama

Untuk Menjatuhkan Kunci Utama, kami menggunakan sintaks di bawah ini. Tidak masalah jika Kunci Utama berada di satu atau beberapa kolom.

ALTER TABLE <schema_name>.<table_name>
DROP CONSTRAINT <constraint_name> ;

Untuk menghapus Batasan Kunci Utama pada HumanResources.Employees tabel, gunakan skrip di bawah ini:

ALTER TABLE HumanResources.Employees
DROP CONSTRAINT PK_Employees;

Menjatuhkan Kunci Utama akan menghapus Kunci Utama dan indeks Clustered atau Non-clustered yang dibuat bersama dengan pembuatan kunci Primer:

Ubah Kunci Utama

Di SQL Server, tidak ada perintah langsung untuk mengubah kunci utama. Kita perlu Menjatuhkan Kunci Utama yang ada dan membuatnya kembali dengan modifikasi yang diperlukan. Oleh karena itu, langkah-langkah untuk memodifikasi kunci utama adalah:

  1. Lepaskan Kunci Utama yang ada.
  2. Buat Kunci Utama baru dengan perubahan yang diperlukan.

Nonaktifkan/Aktifkan Kunci Utama

Saat melakukan pemuatan massal pada tabel dengan banyak catatan, nonaktifkan Kunci Utama dan aktifkan kembali untuk kinerja yang lebih baik. Langkah-langkahnya di bawah ini:

Nonaktifkan Kunci Utama yang ada dengan sintaks di bawah ini:

ALTER INDEX <index_name> ON <schema_name>.<table_name> DISABLE;

Untuk menonaktifkan Kunci Utama pada HumanResources.Employee tabel, scriptnya adalah:

ALTER INDEX PK_Employees ON HumanResources.Employees
DISABLE;

Aktifkan Kunci Utama yang ada yang berada dalam status dinonaktifkan. Kita perlu MEMBANGUN KEMBALI indeks menggunakan sintaks di bawah ini:

ALTER INDEX <index_name> ON <schema_name>.<table_name> REBUILD;

Untuk mengaktifkan Kunci Utama pada HumanResources.Employee tabel, gunakan skrip berikut:

ALTER INDEX PK_Employees ON HumanResources.Employees
REBUILD;

Mitos tentang Kunci Utama

Banyak orang bingung tentang mitos di bawah ini terkait dengan Kunci Utama di SQL Server.

  • Tabel dengan Kunci Utama bukan Tabel Heap
  • Kunci Utama memiliki Indeks Berkelompok dan data diurutkan dalam Urutan Fisik

Mari kita perjelas.

Tabel dengan Kunci Utama bukan Tabel Heap

Sebelum menyelam lebih dalam, mari kita merevisi definisi Kunci Utama dan Tabel Heap.

Kunci Utama membuat Indeks Tergugus pada tabel jika tidak ada indeks berkerumun lain yang tersedia di sana. Tabel tanpa Indeks Clustered akan menjadi Tabel Heap.

Berdasarkan definisi ini, kita dapat memahami bahwa kunci Utama membuat Indeks Tergugus hanya jika tidak ada Indeks Berkelompok lainnya di atas meja. Jika ada indeks berkerumun yang ada, pembuatan Kunci Utama akan membuat indeks yang tidak berkerumun pada tabel yang cocok dengan Kunci Utama.

Mari kita verifikasi ini dengan menghapus HumanResources.Employees Tabel dan membuatnya kembali:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED (Employee_Id)
);
GO

Kita dapat menentukan opsi indeks NONCLUSTERED untuk Kunci Utama (lihat di atas). Tabel dibuat dengan indeks unik yang tidak berkerumun untuk Karyawan PK_Kunci Utama .

Oleh karena itu, tabel ini adalah Tabel Heap meskipun memiliki Kunci Utama.

Mari kita lihat apakah SQL Server dapat membuat indeks non-cluster untuk Primary Key jika kita tidak menentukan kata kunci Non-clustered selama pembuatan kunci Primer. Gunakan skrip di bawah ini:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO

-- Create Clustered Index on Employee_Id column before creating Primary Key
CREATE CLUSTERED INDEX IX_Employee_ID ON HumanResources.Employees(First_Name, Last_Name);
GO

-- Create Primary Key on Employee_Id column
ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);
GO

Di sini kita telah membuat indeks berkerumun secara terpisah sebelum pembuatan Kunci Utama. Dan sebuah tabel hanya dapat memiliki satu indeks berkerumun. Oleh karena itu, SQL Server telah membuat Kunci Utama sebagai indeks yang unik dan tidak berkerumun. Saat ini, tabel tersebut bukanlah tabel Heap karena memiliki indeks berkerumun.

Jika saya berubah pikiran dan menjatuhkan indeks berkerumun di First_Name dan Nama_Last kolom menggunakan skrip di bawah ini:

DROP INDEX IX_Employee_ID ON HumanResources.Employees;
GO

Kami telah berhasil menjatuhkan indeks berkerumun. Sumber Daya Manusia.Karyawan tabel adalah tabel Heap meskipun kami memiliki Kunci Utama yang tersedia di tabel:

Ini menghilangkan mitos bahwa tabel dengan Kunci Utama dapat menjadi tabel Heap jika tidak ada indeks berkerumun yang tersedia di tabel.

Kunci Utama akan memiliki Indeks Terkelompok dan Data Diurutkan dalam Urutan Fisik

Seperti yang kita pelajari dari contoh sebelumnya, kunci utama dalam SQL dapat memiliki indeks non-cluster. Dalam hal ini, catatan tidak akan diurutkan dalam urutan Fisik.

Mari kita verifikasi tabel dengan indeks berkerumun pada kunci utama. Kami akan memeriksa apakah itu mengurutkan catatan dalam urutan Fisik.

Buat ulang HumanResources.Employee tabel dengan kolom minimal dan properti IDENTITY dihapus untuk Employee_ID kolom:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL
);
GO

Sekarang setelah kita membuat tabel tanpa Kunci Utama atau indeks berkerumun, kita dapat MEMASUKKAN 3 catatan dalam urutan yang tidak diurutkan untuk Id_Karyawan kolom:

INSERT INTO HumanResources.Employees ( Employee_Id, First_Name, Last_Name)
VALUES
(3, 'Antony', 'Mark'),
(1, 'James', 'Cameroon'),
(2, 'Jackie', 'Chan')

Mari kita pilih dari HumanResources.Employeees tabel:

SELECT * 
FROM HumanResources.Employees

Kita dapat melihat record yang diambil dalam urutan yang sama dengan record yang disisipkan dari tabel Heap saat ini.

Mari buat Kunci Utama pada tabel Heap ini dan lihat apakah itu berdampak pada pernyataan SELECT:

ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);
GO
SELECT * 
FROM HumanResources.Employees

Setelah pembuatan Primary Key, kita dapat melihat bahwa pernyataan SELECT mengambil record dalam urutan Ascending dari Employee_Id (kolom Kunci Utama). Ini karena indeks berkerumun di Id_Karyawan .

Jika Primary Key dibuat dengan opsi non-clustered, data tabel tidak akan diurutkan berdasarkan kolom Primary Key.

Jika panjang satu record dalam tabel melebihi 4030 byte, hanya satu record yang dapat memuat satu halaman. Indeks berkerumun memastikan bahwa halaman berada dalam urutan Fisik.

Halaman adalah unit penyimpanan dasar dalam file data SQL Server dengan ukuran 8 KB (8192 byte). Hanya 8060 byte dari unit itu yang dapat digunakan untuk penyimpanan data. Sisanya untuk header halaman dan internal lainnya.

Kiat Memilih Kolom Kunci Utama

  • Kolom tipe data bilangan bulat paling cocok untuk Kolom Kunci Utama karena menempati ukuran penyimpanan yang lebih kecil dan dapat membantu mengambil data lebih cepat.
  • Karena Kolom Kunci Utama memiliki indeks berkerumun secara default, gunakan opsi IDENTITY pada kolom tipe data integer agar nilai baru dihasilkan dalam urutan inkremental.
  • Daripada membuat kunci Utama pada Beberapa kolom, buat kolom bilangan bulat baru dengan properti IDENTITY yang ditentukan. Juga, buat indeks unik pada beberapa kolom yang awalnya diidentifikasi untuk kinerja yang lebih baik.
  • Cobalah untuk menghindari kolom dengan tipe data string seperti varchar, nvarchar, dll. Kami tidak dapat menjamin peningkatan berurutan data pada tipe data ini. Ini dapat memengaruhi kinerja INSERT pada kolom ini.
  • Pilih kolom yang nilainya tidak akan diperbarui sebagai Kunci Utama. Misalnya, jika nilai Kunci Utama dapat berubah dari 5 menjadi 1000, pohon-B yang terkait dengan indeks berkerumun perlu diperbarui sehingga menghasilkan sedikit penurunan kinerja.
  • Jika kolom tipe data string perlu dipilih sebagai kolom Kunci Utama, pastikan panjang kolom tipe data varchar atau nvarchar tetap kecil untuk performa yang lebih baik.

Kesimpulan

Kami telah melalui dasar-dasar Kendala yang tersedia di SQL Server. Kami memeriksa batasan Kunci Utama secara mendetail dan mempelajari cara membuat, melepaskan, memodifikasi, menonaktifkan, dan membangun kembali kunci Utama. Selain itu, kami telah mengklarifikasi beberapa mitos populer seputar kunci Primer dengan contoh.

Nantikan artikel selanjutnya!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan pembaruan dinamis dengan nama kolom variabel

  2. Alat Pemulihan Cadangan SQL untuk Memperbaiki Cadangan SQL yang Rusak - Ulasan Produk - Posting tamu oleh Daniel Jones

  3. Fungsi Agregat MIN dan MAX di SQL Server

  4. Panduan Mudah tentang Cara Menggunakan Subqueries di SQL Server

  5. Cara Memulihkan Data dari File Log Transaksi SQL Server