Pada artikel ini saya menunjukkan cara membuat kunci asing di SQL Server menggunakan Transact-SQL. Saya mendemonstrasikan cara membuat kunci asing pada saat membuat tabel (bukan memperbarui tabel yang sudah ada).
Kunci asing adalah kolom yang mereferensikan kolom kunci utama tabel lain. Ini menciptakan hubungan antar tabel.
Contoh 1 – Persiapan
Dalam contoh ini saya akan membuat database pengujian dengan satu tabel. Tabel ini akan berisi kunci utama yang akan dirujuk oleh kunci asing kita.
Buat databasenya:
BUAT DATABASE FK_Test;
Sekarang buat tabel kunci utama:
GUNAKAN FK_Test;CREATE TABLE Country( CountryId int IDENTITY (1,1) NOT NULL PRIMARY KEY, CountryName nvarchar(60));
Contoh 2 – Membuat Kunci Asing
Sekarang setelah kita memiliki tabel dengan kunci utama, mari buat tabel lain dengan kunci asing yang mereferensikan kunci utama tersebut.
BUAT TABEL Kota( CityId int IDENTITY (1,1) NOT NULL PRIMARY KEY, CountryId int NOT NULL REFERENSI Negara(CountryId), CityName nvarchar(60));
Ini adalah cara paling sederhana untuk membuat kunci asing. Yang kita lakukan hanyalah menambahkan REFERENCES
klausa (bersama dengan tabel dan kolom kunci utama) ke kolom yang akan memiliki batasan kunci asing.
Untuk lebih jelasnya, bagian yang mendefinisikan kunci asing adalah ini:
REFERENSI Negara(CountryId)
Ini termasuk dalam definisi kolom dan hanya menyatakan bahwa kolom ini akan mereferensikan CountryId
kolom di Country
tabel.
Dalam hal ini, kunci asing dan kunci utama yang dirujuk, memiliki nama yang sama (CountryId
). Namun, ini bukan persyaratan – kolom kunci asing Anda dapat memiliki nama yang sama sekali berbeda dengan kolom yang dirujuknya (walaupun semua kolom yang berpartisipasi dalam hubungan kunci asing harus didefinisikan dengan panjang dan skala yang sama).
Contoh ini menyebabkan SQL Server secara otomatis menghasilkan nama kunci asing. Itu karena saya tidak memberikan nama. Baca terus untuk mengetahui cara membuat nama untuk kunci asing Anda.
Tapi pertama-tama, mari kita periksa batasan kunci asing yang baru saja kita buat.
Contoh 3 – Periksa Batasan Kunci Asing
Ada banyak cara untuk mengembalikan kunci asing menggunakan T-SQL, dan ini salah satunya:
EXEC sp_fkeys @fktable_name =Kota;
Hasil (menggunakan keluaran vertikal):
PKTABLE_QUALIFIER | FK_TestPKTABLE_OWNER | dboPKTABLE_NAME | NegaraPKCOLUMN_NAME | CountryIdFKTABLE_QUALIFIER | FK_TestFKTABLE_OWNER | dboFKTABLE_NAME | KotaFKCOLUMN_NAME | CountryIdKEY_SEQ | 1UPDATE_ATURAN | 1HAPUS_ATURAN | 1FK_NAME | FK__City__CountryId__38996AB5PK_NAME | PK__Negara__10D1609FC8BFA7F2DEFERRABILITY | 7
sp_fkeys
prosedur tersimpan sistem mengembalikan informasi tentang kunci asing kami, kunci utama terkait, dan detail relevan lainnya. Anda cukup memasukkan nama tabel kunci asing atau tabel kunci utama, dan itu akan mengembalikan info yang relevan.
Dalam contoh ini, saya memberikan nama tabel kunci asing – City
. Pada hasilnya, kita dapat melihat
FK_NAME
kolom untuk melihat bahwa tabel ini memiliki batasan kunci asing yang disebut
FK__City__CountryId__38996AB5
. Ini yang baru saja kita buat.
Jadi sekarang setelah kita membuat kunci asing, setiap kali kita mencoba memasukkan atau memperbarui nilai di City.CountryId
kolom, batasan kunci asing hanya akan mengizinkannya jika nilai yang sama sudah ada di Country.CountryId
kolom. Ini memastikan bahwa integritas referensial dipertahankan dalam database.
Contoh 4 – Opsi Lainnya
Dimungkinkan untuk menambahkan lebih banyak opsi ke definisi kunci asing Anda.
Misalnya Anda dapat memberikan nama untuk kunci asing. Anda juga dapat menentukan apa yang harus terjadi pada nilai di kolom ini jika nilai yang sesuai di kunci utama diperbarui atau dihapus.
Di sini, saya membuat kedua tabel lagi, tetapi kali ini saya secara eksplisit menentukan opsi ini (saya melakukan hal yang sama untuk kunci utama):
CREATE TABLE Country( CountryId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_Country_CountryId PRIMARY KEY CLUSTERED (CountryId), CountryName nvarchar(60));CREATE TABLE City( CityId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_City_CityId PRIMARY KEY CLUSTERED (CityId), CountryId int NOT NULL, CONSTRAINT FK_City_Country FOREIGN KEY (CountryID) REFERENSI Negara (CountryID) ON DELETE CASCADE ON UPDATE CASCADE, CityName nvarchar(60));Dalam hal ini, definisi kunci asing dimulai dengan
CONSTRAINT
, diikuti dengan nama kunci asing, diikuti denganFOREIGN KEY
, diikuti oleh kolom tempat batasan kunci asing akan diterapkan (disisipkan dalam tanda kurung).Kami kemudian melihat
REFERENCES
yang sama klausa yang kita lihat pada contoh sebelumnya.
ON DELETE CASCADE
danON UPDATE CASCADE
klausa digunakan untuk memastikan bahwa perubahan yang dibuat padaCountry
tabel secara otomatis disebarkan keCity
meja. Misalnya, jika sebuah baris dihapus dari tabel induk (kunci utama), setiap baris yang sesuai akan dihapus dari tabel referensi (kunci asing).Nilai default untuk
ON DELETE
danON UPDATE
adalahNO ACTION
. Dalam hal ini Mesin Basis Data menimbulkan kesalahan, dan tindakan pembaruan atau penghapusan pada baris di tabel induk dibatalkan.Anda juga dapat menggunakan
SET NULL
untuk mengatur kolom kunci asing keNULL
(memerlukan kolom kunci asing untuk menjadi nullable), atauSET DEFAULT
untuk menyetelnya ke nilai default (memerlukan kolom kunci asing untuk memiliki definisi default. Jika kolom adalah nullable, dan tidak ada nilai default eksplisit yang ditetapkan,NULL
menjadi nilai default implisit kolom).Dalam contoh ini saya juga mengambil kesempatan untuk menyebutkan kunci utama. Anda dapat melihat bahwa sintaks kunci utama mirip dengan sintaks kunci asing, tetapi tanpa
REFERENCES
klausa (dan dengan tambahanCLUSTERED
argumen, yang merupakan default untuk kunci utama).Sekarang periksa kunci asing:
EXEC sp_fkeys @fktable_name =Kota;Hasil:
PKTABLE_QUALIFIER | FK_TestPKTABLE_OWNER | dboPKTABLE_NAME | NegaraPKCOLUMN_NAME | CountryIdFKTABLE_QUALIFIER | FK_TestFKTABLE_OWNER | dboFKTABLE_NAME | KotaFKCOLUMN_NAME | CountryIdKEY_SEQ | 1UPDATE_ATURAN | 0HAPUS_ATURAN | 0FK_NAME | FK_City_CountryPK_NAME | PK_Country_CountryIdDEFERRABILITY | 7Kita bisa melihat nama foreign key tersebut sekarang FK_City_Country dan batasan kunci utama dari kolom yang dirujuknya disebut PK_Country_CountryId .
Contoh 5 – Kunci Asing pada Beberapa Kolom
Anda juga dapat membuat kunci asing di beberapa kolom yang mereferensikan kunci utama multikolom. Kunci primer multikolom juga dikenal sebagai kunci primer komposit. Untuk membuat kunci asing komposit, cukup pisahkan kolom dengan koma saat mendefinisikan kunci.
Seperti ini:
BATASAN FK_FKName FOREIGN KEY (FKColumn1, FKColumn2)REFERENSI PrimaryKeyTable (PKColumn1, PKColumn2)Lihat Cara Membuat Kunci Asing Gabungan di SQL Server untuk contoh yang lebih detail.
Apakah Kunci Utama Benar-Benar Diperlukan?
Kunci utama tidak mutlak diperlukan untuk kunci asing, karena Anda dapat menggunakan batasan unik atau indeks unik. Secara khusus, dokumentasi Microsoft menyatakan ini:
FOREIGN KEY
batasan hanya dapat mereferensikan kolom diPRIMARY KEY
atauUNIQUE
batasan dalam tabel yang direferensikan atau dalamUNIQUE INDEX
pada tabel yang dirujuk.Jadi, meskipun biasanya merupakan praktik yang baik untuk memiliki kunci utama di semua tabel, kunci asing Anda tidak berkewajiban untuk mereferensikannya.