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?

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

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


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ᵀᴹ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.