Как использовать Уникальный ключ через комбинации полей таблицы?

9

Взгляните на следующее 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) ;

У меня есть базовая таблица контактов. network_idИ network_contact_idполя содержат идентификационные номера , которые ссылаются на другие таблицы.

Я хочу иметь возможность выполнять INSERT IGNOREзапросы к этой таблице, но я хочу использовать комбинацию network_idи network_contact_idкак уникальный ключ для сопоставления.

Так, например, если я попытаюсь вставить контакт, который имел network_id = 4и network_contact_id = 12, INSERT IGNOREзапрос увидит, что запись уже существует, и проигнорирует любую выданную ошибку.

Так что в принципе network_idне уникален. network_contact_idне уникален. Но комбинация двух уникальна. Как мне это настроить? Должен ли я иметь одно другое поле, представляющее собой объединенные значения двух других полей? Или есть способ настроить ключи для этой таблицы, чтобы она делала то, что мне нужно?

Джейк Уилсон
источник

Ответы:

9

Ты пробовал

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 Оба ваших ответа и @ ypercube имеют одинаковые временные метки. +1 для вас обоих.
RolandoMySQLDBA
1
Есть ли какая-либо причина сохранять idполе в качестве первичного ключа, если эта unique keyвещь установлена?
Джейк Уилсон
1
Вот один связанный вопрос о сохранении поля id.
Дерек Дауни
1
@Rolando: На самом деле DTest был быстрее на 1 секунду :)
ypercubeᵀᴹ
6

Измените определение таблицы, добавив UNIQUE KEYограничение на комбинацию двух столбцов:

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

Вы должны также проверить этот ответ Билла Karwin о различиях между INSERT IGNORE, REPLACEиINSERT ... ON DUPLICATE KEY UPDATE

ypercubeᵀᴹ
источник
1
Почему в вашем определении есть ограничение, а в DTest нет? В чем разница?
Джейк Уилсон
4
Это только предоставление имени для ограничения. Если я хорошо помню, с ответом DTest, ограничение будет автоматически названо MySQL.
ypercubeᵀᴹ