Di SQL, Anda membuat hubungan dengan membuat batasan kunci asing.
Lebih khusus lagi, Anda memiliki tabel induk dan tabel anak. Induk berisi kunci utama, dan tabel anak berisi kunci asing yang mereferensikan kunci utama tabel induk.
Saat Anda menggunakan SQL untuk membuat hubungan, Anda bisa membuat hubungan pada saat Anda membuat tabel, atau Anda bisa membuatnya nanti (dengan mengubah tabel). Artikel ini membahas kedua skenario tersebut.
Membuat Hubungan Saat Membuat Tabel
Berikut ini contoh membuat hubungan dalam CREATE TABLE
pernyataan pada saat Anda membuat tabel.
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
Di sini saya membuat dua tabel; yang disebut Parent
dan yang lainnya disebut Child
.
Saya membuat hubungan dalam definisi tabel untuk anak. Hubungan dibuat dengan CONSTRAINT
argumen. Perhatikan bahwa ini masih di dalam CREATE TABLE
pernyataan.
Hubungan membutuhkan nama. Dalam hal ini saya menyebutnya FK_Child_Parent
. FOREIGN KEY
bagian diikuti dengan nama kolom (di tabel anak) yang akan menjadi kunci asing.
REFERENCES
bagian menentukan kolom yang akan dirujuk oleh kunci asing. Dalam hal ini referensi ParentId
kolom Parent
meja. Ini dilakukan dengan menggunakan REFERENCES Parent (ParentId)
.
Hanya itu yang diperlukan untuk menciptakan hubungan.
Perhatikan bahwa contoh di halaman ini dilakukan menggunakan SQL Server. Bergantung pada DBMS Anda, Anda mungkin perlu mengubah beberapa detail definisi kolom.
Misalnya IDENTITY
adalah versi SQL Server dari apa yang terkadang disebut AUTO_INCREMENT
di DBMS lain (seperti MySQL). Jika Anda menggunakan SQLite, berikut ini cara membuat kolom penambahan otomatis di SQLite.
Menambahkan Hubungan ke Tabel yang Ada
Anda juga dapat menambahkan hubungan ke tabel yang ada, cukup dengan menggunakan ALTER TABLE
pernyataan.
Mari kita berpura-pura bahwa kita tidak membuat hubungan saat membuat dua tabel dari contoh sebelumnya. Jadi mari kita berpura-pura bahwa kita yang melakukan ini:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
Jadi dalam skenario ini, yang kami lakukan hanyalah membuat dua tabel. Tidak ada hubungan yang tercipta di antara mereka.
Sekarang, setelah membuat tabel, kita tiba-tiba teringat “oh, saya lupa membuat hubungan!”.
Tidak masalah, sekarang kita bisa melakukan ini:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
Selesai. Kami baru saja menambahkan hubungan menggunakan detail yang sama seperti contoh sebelumnya.
Perhatikan bahwa SQLite tidak mendukung penambahan kunci asing dengan ALTER TABLE
penyataan. Lihat cara menambahkan kunci asing ke tabel yang ada di SQLite untuk mengetahui lebih lanjut tentang itu.
Saat Perbarui/Hapus
Secara default, hubungan SQL Server dibuat menggunakan ON DELETE NO ACTION
dan ON UPDATE NO ACTION
. Oleh karena itu, contoh sebelumnya dibuat menggunakan pengaturan ini.
Namun, DBMS yang berbeda dapat menggunakan pengaturan default lainnya.
Either way, Anda dapat secara eksplisit menentukan ini dalam kode Anda. Jadi kita bisa memodifikasi contoh sebelumnya menjadi seperti ini:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Apa artinya ini sebenarnya adalah, jika seseorang mencoba menghapus atau memperbarui catatan di kunci utama, kesalahan akan terjadi dan perubahan akan dibatalkan. Ini adalah cara SQL Server untuk mencegah perubahan apa pun yang dapat merusak integritas referensial sistem Anda.
Pada dasarnya, alasan Anda membuat hubungan adalah untuk menegakkan integritas referensial.
Namun, Anda memiliki beberapa opsi tentang bagaimana Anda ingin SQL Server menangani situasi ini.
Secara khusus, Anda dapat menggunakan salah satu dari nilai berikut:
NO ACTION
:Kesalahan muncul dan tindakan hapus/perbarui pada baris di tabel induk dibatalkan.CASCADE
:Baris yang sesuai akan dihapus dari/diperbarui di tabel referensi jika baris tersebut dihapus dari/diperbarui di tabel induk.SET NULL
:Semua nilai yang membentuk kunci asing disetel keNULL
jika baris yang sesuai di tabel induk dihapus atau diperbarui. Ini mengharuskan kolom kunci asing tidak dapat dibatalkan.SET DEFAULT
:Semua nilai yang membentuk kunci asing disetel ke nilai defaultnya jika baris yang sesuai di tabel induk dihapus atau diperbarui. Agar batasan ini dapat dijalankan, semua kolom kunci asing harus memiliki definisi default. Jika kolom dapat dibatalkan, dan tidak ada nilai default eksplisit yang ditetapkan,NULL
menjadi nilai default implisit kolom.