¿Cómo utilizar la clave única mediante combinaciones de campos de tabla?

9

Eche un vistazo al siguiente 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) ;

Tengo una tabla básica de contactos. Los campos network_idy network_contact_idcontienen números de identificación que enlazan con otras tablas.

Quiero poder ejecutar INSERT IGNOREconsultas en esta tabla, pero quiero usar la combinación de network_idy network_contact_idcomo la clave única para comparar.

Entonces, por ejemplo, si intenté insertar un contacto que tenía network_id = 4y network_contact_id = 12, la INSERT IGNOREconsulta vería que esa entrada ya existe e ignoraría cualquier error que se haya lanzado.

Entonces, básicamente, network_idno es único. network_contact_idNo es único. Pero la combinación de los dos es única. ¿Cómo configuro esto? ¿Tendría que tener otro único campo que sean los valores concatenados de los otros dos campos? ¿O hay una manera de configurar las teclas para esta tabla para que haga lo que necesito?

Jake Wilson
fuente

Respuestas:

9

Has probado

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
fuente
2
OMG Tanto su respuesta como @ ypercube tienen marcas de tiempo idénticas. +1 para los dos.
RolandoMySQLDBA
1
¿Hay alguna razón para mantener el idcampo como clave principal si esta unique keycosa ahora está configurada?
Jake Wilson
1
Aquí hay una pregunta relacionada sobre el tema de mantener el campo id.
Derek Downey
1
@Rolando: En realidad, DTest fue más rápido en 1 segundo :)
ypercubeᵀᴹ
6

Cambie la definición de la tabla agregando una UNIQUE KEYrestricción en la combinación de las dos columnas:

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

También debe comprobar esta respuesta por Bill Karwin en las diferencias entre INSERT IGNORE, REPLACEyINSERT ... ON DUPLICATE KEY UPDATE

ypercubeᵀᴹ
fuente
1
¿Por qué su definición tiene la restricción allí cuando la de DTest no? ¿Cuál es la diferencia?
Jake Wilson
44
Esto solo proporciona un nombre para la restricción. Si recuerdo bien, con la respuesta de DTest, la restricción será nombrada automáticamente por MySQL.
ypercubeᵀᴹ