Bagaimana cara menggunakan kunci unik melalui kombinasi bidang tabel?

9

Lihatlah sqlfiddle berikut: http://sqlfiddle.com/#!2/dacb5/1

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int
    );

INSERT INTO contacts
(name, network_id, network_contact_id)
VALUES
('John', 4, 10),
('Alex', 4, 11),
('Bob', 4, 12),
('Jeff', 4, 45),
('Bill', 7, 11),
('Walter', 7, 45),
('Jessie', 7, 360) ;

Saya memiliki tabel dasar kontak. Bidang network_iddan network_contact_idberisi nomor id yang menautkan ke tabel lain.

Saya ingin dapat menjalankan INSERT IGNOREkueri ke tabel ini, tapi saya ingin menggunakan kombinasi network_iddan network_contact_idsebagai kunci unik untuk mencocokkan.

Jadi misalnya, jika saya mencoba menyisipkan kontak yang memiliki network_id = 4dan network_contact_id = 12, INSERT IGNOREkueri akan melihat entri itu sudah ada, dan mengabaikan kesalahan yang terjadi.

Jadi pada dasarnya, network_iditu tidak unik. network_contact_idtidak unik. Namun kombinasi keduanya unik. Bagaimana cara mengatur ini? Apakah saya harus memiliki satu bidang lain yang merupakan nilai gabungan dari dua bidang lainnya? Atau ada cara untuk mengatur kunci untuk tabel ini sehingga akan melakukan apa yang saya butuhkan?

Jake Wilson
sumber

Jawaban:

9

Apakah kamu sudah mencoba?

CREATE TABLE contacts (
 id int auto_increment primary key, 
 name varchar(20), 
 network_id int,
 network_contact_id int, 
 UNIQUE KEY (`network_id`, `network_contact_id`)
);
Derek Downey
sumber
2
OMG Baik jawaban Anda dan @ ypercube's memiliki cap waktu yang identik. +1 untuk Anda berdua.
RolandoMySQLDBA
1
Apakah ada alasan untuk mempertahankan idbidang sebagai kunci utama jika unique keyhal ini sekarang disetel?
Jake Wilson
1
Berikut ini satu pertanyaan terkait tentang menjaga field id.
Derek Downey
1
@Rando: Sebenarnya DTest lebih cepat dalam 1 detik :)
ypercubeᵀᴹ
6

Ubah definisi tabel dengan menambahkan UNIQUE KEYbatasan pada kombinasi dari dua kolom:

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int,
     CONSTRAINT network_id_contact_id_UNIQUE
       UNIQUE KEY (network_id, network_contact_id)
    );

Anda juga harus memeriksa jawaban ini oleh Bill Karwin tentang perbedaan antara INSERT IGNORE, REPLACEdanINSERT ... ON DUPLICATE KEY UPDATE

ypercubeᵀᴹ
sumber
1
Mengapa definisi Anda memiliki kendala di sana ketika DTest tidak? Apa bedanya?
Jake Wilson
4
Ini hanya memberikan nama untuk batasan. Jika saya ingat dengan baik, dengan jawaban DTest, batasannya akan dinamai secara otomatis oleh MySQL.
ypercubeᵀᴹ