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

Cara Membuat Kunci Utama di SQL Server (Contoh T-SQL)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Microsoft SQL Server 2005/2008:XML vs tipe data teks/varchar

  2. @@IDENTITY, SCOPE_IDENTITY(), OUTPUT dan metode lain untuk mengambil identitas terakhir

  3. Menyetel Layanan Pelaporan SQL Server

  4. Masukkan Data di SQL Server 2017

  5. Memperkenalkan Fitur Baru:Always On Availability Group