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.