Come utilizzare la chiave univoca tramite combinazioni di campi tabella?


9

Dai un'occhiata al seguente sqlfiddle: 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) ;

Ho una tabella di contatti di base. I campi network_ide network_contact_idcontengono numeri ID che si collegano ad altre tabelle.

Voglio essere in grado di eseguire INSERT IGNOREquery su questa tabella, ma desidero utilizzare la combinazione di network_ide network_contact_idcome chiave univoca per la corrispondenza.

Quindi, per esempio, se provassi a inserire un contatto che aveva network_id = 4e network_contact_id = 12, la INSERT IGNOREquery vedrebbe quella voce già esistente e ignorerebbe qualsiasi errore che veniva generato.

Quindi, in sostanza, network_idnon è unico. network_contact_idnon è unico. Ma la combinazione dei due è unica. Come lo installo? Dovrei avere un singolo altro campo che è i valori concatenati degli altri due campi? O c'è un modo per impostare le chiavi per questa tabella in modo che faccia ciò di cui ho bisogno?

Risposte:


9

Hai provato

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 Sia la tua risposta che @ ypercube hanno timestamp identici. +1 per entrambi.
RolandoMySQLDBA,

1
C'è qualche motivo per mantenere il idcampo come chiave primaria se questa unique keycosa è ora impostata?
Jake Wilson,

1
Ecco una domanda correlata sulla questione di mantenere il campo ID.
Derek Downey,

1
@Rolando: In realtà DTest è stato più veloce di 1 secondo :)
ypercubeᵀᴹ

6

Modifica la definizione della tabella aggiungendo un UNIQUE KEYvincolo sulla combinazione delle due colonne:

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

Dovresti anche controllare questa risposta di Bill Karwin sulle differenze tra INSERT IGNORE, REPLACEeINSERT ... ON DUPLICATE KEY UPDATE


1
Perché la tua definizione ha il vincolo lì dentro quando quella di DTest no? Qual è la differenza?
Jake Wilson,

4
Ciò fornisce solo un nome per il vincolo. Se ricordo bene, con la risposta DTest, il vincolo verrà automaticamente nominato da MySQL.
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.