Comment utiliser la clé unique via des combinaisons de champs de table?

9

Jetez un œil au sqlfiddle suivant: 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) ;

J'ai une table de base des contacts. Les champs network_idet network_contact_idcontiennent des numéros d'identification liés à d'autres tables.

Je veux pouvoir exécuter des INSERT IGNORErequêtes sur cette table, mais je veux utiliser la combinaison de network_idet network_contact_idcomme clé unique pour la comparaison.

Ainsi, par exemple, si j'essayais d'insérer un contact qui avait network_id = 4et network_contact_id = 12, la INSERT IGNORErequête verrait que l'entrée existe déjà et ignorerait toute erreur levée.

Donc, fondamentalement, ce network_idn'est pas unique. network_contact_idn'est pas unique. Mais la combinaison des deux est unique. Comment configurer cela? Dois-je avoir un seul autre champ qui correspond aux valeurs concaténées des deux autres champs? Ou existe-t-il un moyen de configurer les clés de cette table pour qu'elle fasse ce dont j'ai besoin?

Jake Wilson
la source

Réponses:

9

As-tu essayé

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
la source
2
OMG Votre réponse et @ ypercube ont des horodatages identiques. +1 pour vous deux.
RolandoMySQLDBA
1
Y a-t-il une raison de conserver le idchamp comme clé primaire si cette unique keychose est maintenant définie?
Jake Wilson
1
Voici une question connexe sur la question de la conservation du champ id.
Derek Downey
1
@Rolando: En fait, DTest était plus rapide d'une seconde :)
ypercubeᵀᴹ
6

Modifiez la définition de la table en ajoutant une UNIQUE KEYcontrainte sur la combinaison des deux colonnes:

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

Vous devriez également vérifier cette réponse de Bill Karwin sur les différences entre INSERT IGNORE, REPLACEetINSERT ... ON DUPLICATE KEY UPDATE

ypercubeᵀᴹ
la source
1
Pourquoi votre définition contient-elle la contrainte alors que DTest ne l'est pas? Quelle est la différence?
Jake Wilson
4
Cela fournit uniquement un nom pour la contrainte. Si je me souviens bien, avec la réponse DTest, la contrainte sera automatiquement nommée par MySQL.
ypercubeᵀᴹ