Artikel ini menunjukkan cara membuat kunci utama di SQL Server saat membuat tabel menggunakan Transact-SQL.
Kunci utama adalah satu atau beberapa kolom yang telah dikonfigurasi sebagai pengenal unik untuk tabel tertentu. Kunci utama dapat digunakan untuk menegakkan integritas data dalam tabel.
Sebuah tabel hanya dapat memiliki satu kunci utama, dan kunci utama hanya dapat ditambahkan ke kolom yang didefinisikan sebagai NOT NULL
.
Artikel ini menunjukkan cara membuat kunci utama di baru tabel (yaitu saat membuat tabel). Jika Anda perlu membuat kunci utama di yang sudah ada tabel, lihat Cara Menambahkan Kunci Utama ke Tabel yang Ada di SQL Server.
Contoh 1 – Membuat Tabel dengan Kunci Utama
Pertama saya akan membuat database pengujian:
CREATE DATABASE PK_Test;
Sekarang buat tabel baru yang menyertakan batasan kunci utama:
USE PK_Test; CREATE TABLE Colors ( ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY, ColorName varchar(50) );
Ini membuat tabel baru bernama Colors
yang memiliki batasan kunci utama pada ColorId
kolom.
Contoh 2 – Periksa Batasan Kunci Utama
Kita dapat menjalankan kode berikut untuk mengembalikan daftar batasan kunci utama dalam database:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
Hasil:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__Colors__8DA7674DD34F4585 | PK | 1 | 1 | +------------------------------+--------+-------------------+-------------------+
Saya telah mempersempit kolom untuk contoh ini. sys.key_constraints
tampilan sistem mengembalikan lebih banyak kolom dari ini. Anda selalu dapat menggunakan *
wildcard untuk mengembalikan semua kolom jika Anda mau.
Kita dapat melihat dari hasil query bahwa database ini hanya memiliki satu kunci utama (yang baru saja kita buat).
Dalam hal ini kunci utama secara otomatis dinamai oleh sistem. Anda juga memiliki pilihan untuk memberikan nama Anda sendiri (lebih lanjut tentang itu nanti).
Contoh 3 – Periksa Indeks
Secara default, indeks berkerumun dibuat saat Anda membuat kunci utama. Anda dapat menentukan indeks berkerumun secara eksplisit atau membiarkannya dibuat secara otomatis. Anda juga memiliki opsi untuk menentukan indeks nonclustered.
Berikut kueri yang mengembalikan indeks yang dibuat secara otomatis saat saya membuat kunci utama di atas:
SELECT * FROM sys.indexes WHERE name = 'PK__Colors__8DA7674DD34F4585';
Hasil (menggunakan keluaran vertikal):
object_id | 885578193 name | PK__Colors__8DA7674DD34F4585 index_id | 1 type | 1 type_desc | CLUSTERED is_unique | 1 data_space_id | 1 ignore_dup_key | 0 is_primary_key | 1 is_unique_constraint | 0 fill_factor | 0 is_padded | 0 is_disabled | 0 is_hypothetical | 0 is_ignored_in_optimization | 0 allow_row_locks | 1 allow_page_locks | 1 has_filter | 0 filter_definition | NULL compression_delay | NULL suppress_dup_key_messages | 0 auto_created | 0
Dalam hal ini saya mempersempit hasilnya menjadi hanya baris yang berisi nama kunci utama yang sama dengan yang baru saja saya buat. Anda selalu dapat menghapus WHERE
klausa jika Anda membutuhkan lebih banyak hasil untuk dikembalikan.
Kita dapat melihat bahwa indeks ini memiliki type_desc dari BERKELUM .
Contoh 4 – Memberi Nama Kunci Utama
Kunci utama yang kami buat di atas secara otomatis dinamai oleh sistem. Anda dapat memberikan nama Anda sendiri jika Anda mau.
Berikut adalah contoh menentukan nama untuk kunci utama. Dalam hal ini saya juga menentukan indeks nonclustered.
USE PK_Test; CREATE TABLE Cats ( CatId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_Cats_CatId PRIMARY KEY NONCLUSTERED (CatId), CatName varchar(50) );
Dalam hal ini saya menggunakan CONSTRAINT
opsional kata kunci untuk menunjukkan awal dari definisi kunci utama, diikuti dengan nama yang saya pilih untuk kunci utama. Saya juga menggunakan NONCLUSTERED
kata kunci untuk menentukan indeks yang tidak dikelompokkan.
Periksa kunci utama:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
Hasil:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__Colors__8DA7674DD34F4585 | PK | 1 | 1 | | PK_Cats_CatId | PK | 2 | 0 | +------------------------------+--------+-------------------+-------------------+
Periksa indeks:
SELECT * FROM sys.indexes WHERE name = 'PK_Cats_CatId';
Hasil (menggunakan keluaran vertikal):
object_id | 917578307 name | PK_Cats_CatId index_id | 2 type | 2 type_desc | NONCLUSTERED is_unique | 1 data_space_id | 1 ignore_dup_key | 0 is_primary_key | 1 is_unique_constraint | 0 fill_factor | 0 is_padded | 0 is_disabled | 0 is_hypothetical | 0 is_ignored_in_optimization | 0 allow_row_locks | 1 allow_page_locks | 1 has_filter | 0 filter_definition | NULL compression_delay | NULL suppress_dup_key_messages | 0 auto_created | 0
Jadi kita bisa melihat bahwa kali ini type_desc TIDAK TERMASUK .
Perhatikan bahwa saat membuat tabel, CLUSTERED
dapat ditentukan hanya untuk satu kendala. Jika ditentukan untuk UNIQUE
kendala dan PRIMARY KEY
batasan juga ditentukan, PRIMARY KEY
default ke NONCLUSTERED
.
Contoh 5 – Membuat Kunci Utama pada Kolom Nullable
Kunci utama hanya dapat dibuat untuk kolom yang didefinisikan sebagai NOT NULL
. Jika Anda mencoba membuat kunci utama pada kolom yang disetel ke NULL
, Anda akan mendapatkan pesan kesalahan.
Namun, jika Anda tidak menentukan nullability, kolom disetel ke NOT NULL
secara default.
Untuk mendemonstrasikan ini, mari buat tabel lain, tetapi kali ini, kita akan mengaturnya ke NULL
:
USE PK_Test; CREATE TABLE Dogs ( DogId int IDENTITY (1,1) NULL PRIMARY KEY, DogName varchar(50) );
Hasil:
Msg 8147, Level 16, State 1, Line 3 Could not create IDENTITY attribute on nullable column 'DogId', table 'Dogs'. Msg 8111, Level 16, State 1, Line 3 Cannot define PRIMARY KEY constraint on nullable column in table 'Dogs'. Msg 1750, Level 16, State 0, Line 3 Could not create constraint or index. See previous errors.
Seperti yang diharapkan, kami mendapatkan kesalahan.
Mari kita hapus NULL
dari definisi tabel dan coba lagi:
USE PK_Test; CREATE TABLE Dogs ( DogId int IDENTITY (1,1) PRIMARY KEY, DogName varchar(50) );
Hasil:
Commands completed successfully. Total execution time: 00:00:00.015
Kali ini tabel berhasil dibuat.
Mari kita lihat:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'DogId';
Hasil:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Dogs | DogId | 0 | 1 | +---------+----------+---------------+---------------+
Jadi kita dapat melihat bahwa itu tidak dapat dibatalkan, karena is_nullable bendera disetel ke 0 .
Contoh 6 – Kunci Utama pada Beberapa Kolom
Anda juga dapat membuat kunci utama pada beberapa kolom. Kunci primer multikolom juga dikenal sebagai kunci primer komposit. Untuk membuat kunci utama komposit, cukup pisahkan kolom dengan koma saat mendefinisikan kunci.
Seperti ini:
CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)
Berikut adalah contoh situasi di mana kunci utama multikolom dapat digunakan:
CREATE TABLE Musician ( MusicianId int NOT NULL, FirstName varchar(60), LastName varchar(60), CONSTRAINT PK_Musician PRIMARY KEY (MusicianID) ); CREATE TABLE Band ( BandId int NOT NULL, BandName varchar(255), CONSTRAINT PK_Band PRIMARY KEY (BandId) ); CREATE TABLE BandMember ( MusicianId int NOT NULL, BandId int NOT NULL, CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId), CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId), CONSTRAINT FK_BandMember_Musician FOREIGN KEY (MusicianId) REFERENCES Musician(MusicianId) );
Dalam contoh ini, BandMember
tabel memiliki kunci primer multikolom. Dalam hal ini setiap kolom dalam kunci utama juga merupakan kunci asing ke kunci utama tabel lain, tetapi ini bukan keharusan.
Lihat Cara Membuat Kunci Utama Gabungan di SQL Server untuk penjelasan lebih rinci tentang contoh ini.
Lihat juga Cara Membuat Kunci Asing Gabungan di SQL Server untuk contoh yang membawanya selangkah lebih maju dengan kunci asing multikolom yang mereferensikan kunci utama komposit di atas.