Kunci utama gabungan adalah kunci utama yang terdiri dari beberapa kolom. Microsoft biasanya menyebutnya sebagai kunci utama multikolom dalam dokumentasinya.
Artikel ini memberikan contoh membuat kunci utama komposit menggunakan Transact-SQL di SQL Server.
Anda dapat membuat kunci primer komposit seperti Anda membuat kunci utama tunggal, kecuali bahwa alih-alih menentukan hanya satu kolom, Anda memberikan nama dua kolom atau lebih, dipisahkan dengan koma.
Seperti ini:
CONSTRAINT PK_Name PRIMARY KEY (Kolom1, Kolom2)
Contoh 1 – Membuat Kunci Utama Gabungan
Berikut adalah contoh database yang menggunakan kunci primer komposit.
Untuk keperluan contoh ini, saya akan membuat database bernama PK_Test :
BUAT DATABASE PK_Test;
Sekarang setelah database dibuat, mari kita buat tabelnya.
GUNAKAN PK_Test;CREATE TABLE Musisi (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_BandMember_Band FOREIGN_K REFERENSI KEY (MusicianId) Musisi(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.
Alasan di balik desain database di atas adalah, seorang musisi berpotensi menjadi anggota dari banyak band. Juga, setiap band dapat memiliki banyak musisi. Jadi kita memiliki hubungan banyak-ke-banyak. Inilah sebabnya mengapa BandMember
tabel dibuat – digunakan sebagai tabel referensi silang antara Musician
tabel dan Band
meja.
Kasus khusus ini mendukung kunci primer komposit, karena musisi yang menjadi anggota band harus menjadi kejadian yang unik. Dengan kata lain, kami tidak ingin beberapa baris dengan musisi menjadi anggota dari band yang sama. Itu akan melanggar integritas data. Ini juga dapat menyebabkan kekacauan saat mencoba mempertahankan integritas referensial meskipun kita pernah membuat hubungan antara tabel ini dan tabel lainnya (yang kita lakukan di sini).
Contoh 2 – Sisipkan Data
Setelah menjalankan kode di atas, sekarang saya dapat memuat database dengan data:
MASUKKAN KE NILAI Musisi ( 1, 'Ian', 'Paice' ),( 2, 'Roger', 'Glover' ),( 3, 'Richie', 'Blackmore' ),( 4, 'Rod', ' Evans' ),( 5, 'Ozzy', 'Osbourne' );MASUKKAN KE NILAI Band ( 1, 'Deep Purple' ),( 2, 'Rainbow' ),( 3, 'Whitesnake' ),( 4, 'Iron Maiden ' );INSERT INTO BandMemberVALUES ( 1, 1 ),( 1, 3 ),( 2, 1 ),( 2, 2 ),( 3, 1 ),( 3, 2 ),( 4, 1 );Contoh 3 – Kueri Dasar
Sekarang data ada di database kita, mari jalankan kueri untuk mengembalikan sebagian data itu.
Berikut kueri dasar:
PILIH CONCAT(m.FirstName, ' ', m.LastName) SEBAGAI 'Musisi', b.BandName AS 'Band'FROM Musisi mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band b ON b.BandId =bm .BandId DAN m.MusicianId =bm.MusicianId;Hasil:
+------------------+-------------+| Musisi | Band ||------------------+-------------|| Ian Paice | Ungu Tua || Ian Paice | Ular Putih || Roger Glover | Ungu Tua || Roger Glover | Pelangi || Richie Blackmore | Ungu Tua || Richie Blackmore | Pelangi || Rod Evans | Ungu Tua |+------------------+-------------+Jadi seperti yang diharapkan, ini hanya mengembalikan musisi dan band yang memiliki entri di
BandMember
tabel referensi.Contoh 4 – Kueri yang Sedikit Dimodifikasi
Berikut adalah versi modifikasi dari kueri di atas yang menyajikan hasil dengan cara berbeda:
SELECT b.BandName AS 'Band', STRING_AGG(CONCAT(m.FirstName, ' ', m.LastName), ', ') AS 'Musisi'FROM Musisi mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band b ON b.BandId =bm.BandId DAN m.MusicianId =bm.MusicianIdGROUP OLEH b.BandName;Hasil:
+-------------+-------------------------------- -----------------------+| Band | Musisi ||-------------+--------------------------------- ----------|| Ungu Tua | Ian Paice, Roger Glover, Richie Blackmore, Rod Evans || Pelangi | Roger Glover, Richie Blackmore || Ular Putih | Ian Paice |+-------------+-------------------------------- -----------------------+Di sini hasilnya dikelompokkan berdasarkan band, dan semua musisi untuk setiap band ditampilkan sebagai daftar yang dipisahkan koma dalam satu bidang.
Untuk melakukan ini, saya menggunakan
STRING_AGG()
berfungsi untuk menyatukan para musisi.Kunci Asing Gabungan
Masalah dengan contoh di atas adalah sebagian besar data sudah kedaluwarsa. Beberapa musisi ini benar-benar telah meninggalkan band-band tersebut. Dan beberapa telah pergi dan kemudian kembali di kemudian hari.
Bagaimana kita bisa menghadapi ini?
Kita bisa membuat tabel referensi lain untuk mencatat periode waktu setiap musisi menjadi anggota dari setiap band. Tabel seperti itu perlu merujuk ke
BandMember
tabel melalui kunci asing. Dan mengingat tabel ini memiliki kunci primer komposit, kita perlu menggunakan kunci asing komposit pada tabel baru yang mereferensikannya.Lihat Cara Membuat Kunci Asing Gabungan di SQL Server sebagai contoh. Artikel tersebut menggunakan contoh yang sama seperti di atas, kecuali dengan tabel tambahan dengan kunci asing komposit yang mereferensikan kunci utama komposit di atas.