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
.