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

Cara Membuat Kunci Utama Komposit di SQL Server (Contoh T-SQL)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mendapatkan Model Pemulihan Database di SQL Server menggunakan T-SQL

  2. Bagaimana mengembalikan output dari prosedur tersimpan ke dalam variabel di sql server

  3. Cara mendapatkan daftar Tabel tanpa Batasan Kunci Utama di Database SQL Server - Tutorial SQL Server / T-SQL Bagian 58

  4. Memperkenalkan Fitur Baru - Analisis Deadlock

  5. Grup Ketersediaan AlwaysOn SQL Server:Instalasi dan Konfigurasi. Bagian 2