Wie verwende ich den eindeutigen Schlüssel über Kombinationen von Tabellenfeldern?

9

Schauen Sie sich die folgende sqlfiddle an: 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) ;

Ich habe eine grundlegende Kontakttabelle. Die Felder network_idund network_contact_identhalten ID-Nummern, die mit anderen Tabellen verknüpft sind.

Ich möchte INSERT IGNOREAbfragen für diese Tabelle ausführen können , aber ich möchte die Kombination von network_idund network_contact_idals eindeutigen Schlüssel verwenden, mit dem abgeglichen werden soll.

Wenn ich beispielsweise versuchte, einen Kontakt mit network_id = 4und einzufügen network_contact_id = 12, sah die INSERT IGNOREAbfrage, dass der Eintrag bereits vorhanden ist, und ignorierte alle ausgelösten Fehler.

Also im Grunde network_idist nicht einzigartig. network_contact_idist nicht einzigartig. Aber die Kombination der beiden ist einzigartig. Wie richte ich das ein? Müsste ich ein anderes Feld haben, das den verketteten Werten der beiden anderen Felder entspricht? Oder gibt es eine Möglichkeit, die Schlüssel für diese Tabelle so einzurichten, dass sie das tut, was ich brauche?

Jake Wilson
quelle

Antworten:

9

Hast du versucht

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
quelle
2
OMG Sowohl Ihre Antwort als auch die von @ ypercube haben identische Zeitstempel. +1 für euch beide.
RolandoMySQLDBA
1
Gibt es einen Grund, das idFeld als Primärschlüssel beizubehalten, wenn dieses unique keyElement jetzt festgelegt ist?
Jake Wilson
1
Hier ist eine verwandte Frage zur Beibehaltung des ID-Feldes.
Derek Downey
1
@ Rolando: Eigentlich war DTest um 1 Sekunde schneller :)
ypercubeᵀᴹ
6

Ändern Sie die Definition der Tabelle, indem Sie UNIQUE KEYder Kombination der beiden Spalten eine Einschränkung hinzufügen :

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)
    );

Sie sollten auch diese Antwort von Bill Karwin überprüfen auf die Unterschiede zwischen INSERT IGNORE, REPLACEundINSERT ... ON DUPLICATE KEY UPDATE

ypercubeᵀᴹ
quelle
1
Warum enthält Ihre Definition die Einschränkung, wenn dies bei DTest nicht der Fall ist? Was ist der Unterschied?
Jake Wilson
4
Dies gibt nur einen Namen für die Einschränkung an. Wenn ich mich gut erinnere, wird mit der DTest-Antwort die Einschränkung von MySQL automatisch benannt.
Ypercubeᵀᴹ