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

Cara Menambahkan Kunci Utama ke Tabel yang Ada di SQL Server (Contoh T-SQL)

Artikel ini menunjukkan cara menambahkan kunci utama ke tabel yang sudah ada di SQL Server menggunakan Transact-SQL.

Kunci utama adalah kolom yang telah dikonfigurasi sebagai pengenal unik untuk tabel tertentu.

Anda biasanya akan membuat batasan kunci utama saat membuat tabel, tetapi Anda juga bisa menambahkan kunci utama ke tabel yang sudah ada.

Perhatikan bahwa tabel hanya dapat memiliki satu kunci utama. Jadi Anda tidak dapat menambahkan kunci utama jika tabel sudah memilikinya.

Juga kunci utama hanya dapat ditambahkan ke kolom yang didefinisikan sebagai NOT NULL .

Contoh 1 – Tambahkan Batasan Kunci Utama

Dalam contoh ini saya membuat tabel, tetapi saya lupa menambahkan batasan kunci utama. Jadi saya kembali dan mengubah tabel untuk memiliki kunci utama.

Buat tabel (tetapi lupa membuat kunci utama ):

USE Test;

CREATE TABLE Colors
(
    ColorId int IDENTITY (1,1) NOT NULL,
    ColorName varchar(50)
);

Hasil:

Commands completed successfully.
Total execution time: 00:00:00.058

Ups – Saya lupa membuat kunci utama!

Tidak masalah! Kita bisa menambahkan satu sekarang:

ALTER TABLE Colors
ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);

Hasil:

Commands completed successfully.
Total execution time: 00:00:00.031

Ini sekarang telah menambahkan PRIMARY KEY batasan untuk ColorId kolom.

Contoh 2 – Periksa Batasan Kunci Utama

Mari kita jalankan 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__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
| PK_Colors_ColorId            | PK     | 1                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Hasil Anda akan berbeda, tergantung pada kunci utama dalam database Anda.

Perhatikan juga bahwa tampilan sistem ini mengembalikan lebih banyak kolom daripada yang saya tentukan di sini, tetapi Anda dapat menggunakan * wildcard untuk mengembalikan semua kolom jika Anda mau.

Contoh 3 – Menambahkan Kunci Utama ke Kolom yang memungkinkan Nilai NULL

Kunci utama hanya dapat ditambahkan ke kolom yang didefinisikan sebagai NOT NULL . Jika Anda mencoba menambahkan kunci utama ke kolom yang dapat dibatalkan, Anda akan mendapatkan kesalahan.

Untuk mendemonstrasikannya, mari buat tabel lain, tetapi kali ini, kita juga lupa untuk menentukan kolom sebagai NOT NULL :

USE Test;

CREATE TABLE Colors2
(
    ColorId int,
    ColorName varchar(50)
);

Kita dapat menjalankan kueri berikut untuk memeriksa apakah kolom mengizinkan null atau tidak:

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 = 'ColorId';

Hasil:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 1             | 0             |
+---------+----------+---------------+---------------+

Kita dapat melihat bahwa yang kita buat sebelumnya (di Colors table) adalah nullable dan merupakan kolom identitas. Yang kedua (dalam Colors2 table) dapat dibatalkan dan bukan merupakan kolom identitas.

Sekarang mari kita coba menambahkan batasan kunci utama ke kolom nullable:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Hasil:

Msg 8111, Level 16, State 1, Line 1
Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.

Jadi dalam hal ini, kita perlu mengubah kolom menjadi NOT NULL sebelum kita mencoba mendefinisikannya sebagai kunci utama.

Kita bisa menggunakan ALTER COLUMN dalam ALTER TABLE pernyataan untuk menyetel kolom ini ke NOT NULL :

ALTER TABLE Colors2
ALTER COLUMN ColorId int NOT NULL;

Mari kita periksa lagi kolomnya:

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 = 'ColorId';

Hasil:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 0             |
+---------+----------+---------------+---------------+

Jadi kita dapat melihat bahwa Colors2 sekarang disetel ke 0 , yang berarti tidak dapat dibatalkan (tidak boleh berisi nilai NULL).

Perhatikan juga bahwa kolomnya bukan kolom identitas. Saya akan membahas ini nanti.

Bagaimanapun, sekarang kolom tersebut didefinisikan sebagai NOT NULL kita dapat melanjutkan dan menambahkan kunci utama:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Hasil:

Commands completed successfully.
Total execution time: 00:00:00.048

Untuk memverifikasi, mari kita periksa kembali semua batasan kunci utama untuk tabel ini:

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__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
| PK_Colors_ColorId            | PK     | 1                 | 0                 |
| PK_Colors2_ColorId           | PK     | 1                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Kunci utama baru kami yang kami sebut PK_Colors2_ColorId telah ditambahkan ke daftar.

Contoh 4 – Mengubah Kolom menjadi Kolom Identitas

Kunci utama sering diterapkan pada kolom identitas. Kolom identitas didefinisikan seperti itu dengan IDENTITY kata kunci, diikuti oleh benih opsional dan nilai kenaikan dalam tanda kurung.

Saat baris baru ditambahkan ke tabel, SQL Server memberikan nilai tambahan yang unik untuk kolom identitas.

Jika Anda berencana menggunakan kolom identitas, Anda harus sudah melakukannya. Anda tidak dapat mengubah kolom yang ada menjadi kolom identitas.

Ketika saya menjalankan kueri sebelumnya, kami dapat melihat bahwa Colors2.ColorId kolom tidak kolom identitas (kami tahu ini karena is_identity disetel ke 0 ). Ini berarti saya membuat PK_Colors2_ColorId kunci utama pada kolom non-identitas.

Inilah yang terjadi jika kita mencoba mengubah tabel menjadi kolom identitas:

ALTER TABLE Colors2
ALTER COLUMN 
  ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;

Hasil:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IDENTITY'.

Seperti yang disebutkan, untuk mengatasi ini, kita perlu menjatuhkan kolom dan memulai lagi.

Jika kolom sudah berisi data, Anda harus melakukan beberapa pekerjaan ekstra. Itu di luar cakupan artikel ini, tetapi berikut adalah contoh menghapus kolom di atas dan membuatnya kembali sebagai kolom identitas:

USE Test; 

DROP TABLE Colors2;

CREATE TABLE Colors2
(
    ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    ColorName varchar(50)
);

Hasil:

Commands completed successfully.
Total execution time: 00:00:00.049

Perhatikan bahwa saya tidak memberikan nama untuk batasan kunci utama kali ini. Dalam hal ini, sistem akan membuat nama untuknya.

Cepat periksa kolom:

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 = 'ColorId';

Hasil:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 1             |
+---------+----------+---------------+---------------+

Ya, sekarang menjadi kolom identitas.

Mari kita lihat lagi kunci utama untuk tabel ini:

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__MyTest__606C418F16F9CCCF  | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9  | PK     | 1                 | 1                 |
| PK_Colors_ColorId             | PK     | 1                 | 0                 |
| PK__Colors2__8DA7674D8F57294D | PK     | 1                 | 1                 |
+-------------------------------+--------+-------------------+-------------------+

Jadi kita sekarang memiliki kunci utama bernama sistem yang disebut PK__Colors2__8DA7674D8F57294D .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grup SQL Server berdasarkan Hitungan DateTime Per Jam?

  2. Bagaimana cara menjatuhkan kolom dengan kendala?

  3. Dapatkan hari terakhir dalam sebulan di SQL

  4. Bagaimana cara menambahkan atribut khusus ke string koneksi SQL?

  5. Cara Membuat Ekstensi untuk SSMS 2019 (v18)