Bagaimana cara menentukan kunci utama komposit di SQL?

112

Bagaimana cara menentukan kunci utama komposit yang terdiri dari dua bidang di SQL?

Saya menggunakan PHP untuk membuat tabel dan segalanya. Saya ingin membuat nama tabel votingdengan bidang QuestionID, MemeberIDdan vote. Dan kunci utama Komposit terdiri dari bidang QuestionIDdan MemberID.

Bagaimana saya harus melakukan ini?

Zeeshan Rang
sumber
"Dan QuestionID dan MemberID akan menjadi kunci utama." (QuestionID, MemberID) akan menjadi kunci utama (komposit) . Hanya ada satu kunci dan terdiri dari dua kolom.
Draemon

Jawaban:

229

Hanya untuk klarifikasi: sebuah tabel dapat memiliki paling banyak satu kunci utama. Kunci utama terdiri dari satu atau beberapa kolom (dari tabel itu). Jika kunci utama terdiri dari dua atau lebih kolom, itu disebut kunci utama komposit . Ini didefinisikan sebagai berikut:

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);

Pasangan (QuestionID, MemberID) harus unik untuk tabel dan tidak ada nilai yang boleh NULL. Jika Anda melakukan kueri seperti ini:

SELECT * FROM voting WHERE QuestionID = 7

itu akan menggunakan indeks kunci utama. Namun jika Anda melakukan ini:

SELECT * FROM voting WHERE MemberID = 7

itu tidak akan terjadi karena untuk menggunakan indeks komposit memerlukan penggunaan semua kunci dari "kiri". Jika indeks ada di bidang (A, B, C) dan kriteria Anda ada di B dan C maka indeks itu tidak berguna bagi Anda untuk kueri itu. Jadi pilih dari (QuestionID, MemberID) dan (MemberID, QuestionID) mana saja yang paling sesuai untuk bagaimana Anda akan menggunakan tabel.

Jika perlu, tambahkan indeks di sisi lain:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
cletus
sumber
5
Jawaban yang bagus. Hanya untuk memperjelas, QuestionID dan MemberID bukanlah kunci utama yang terpisah melainkan kombinasi keduanya membentuk pasangan / tupel yang unik.
Peter
5
Apakah ada manfaat menambahkan indeks (MemberID, QuestionID), sebagai kebalikan dari hanya MemberID? Sejauh yang saya mengerti, Anda mendapatkan pencarian terindeks saat memilih dengan QuestionId, dan juga (QuestionId, MemeberId), jadi satu-satunya yang hilang adalah MemberId.
swalog
Saya tahu jawaban ini cukup lama tetapi karena muncul selama pencarian google ... Sepertinya ada ketidakkonsistenan dalam teks tentang kolom mana yang digunakan (atau tidak) untuk indeks default (es?). Selain itu, ini mengasumsikan bahwa setiap RDBMS akan secara otomatis membuat indeks pada kunci utama, tetapi karena tidak diperlukan oleh standar apa pun, mungkin ada kasus sudut di luar sana.
Ke 마 SE
Karena kedua bidang adalah kunci sederhana (dan mungkin utama) dari tabel lain, contoh menunjukkan kunci majemuk bukan kunci komposit
guymid
6
CREATE TABLE `voting` (
  `QuestionID` int(10) unsigned NOT NULL,
  `MemberId` int(10) unsigned NOT NULL,
  `vote` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`QuestionID`,`MemberId`)
);
Justin
sumber