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?

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

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


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ᵀᴹ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.