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


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


1
Почему в вашем определении есть ограничение, а в DTest нет? В чем разница?
Джейк Уилсон

4
Это только предоставление имени для ограничения. Если я хорошо помню, с ответом DTest, ограничение будет автоматически названо MySQL.
ypercubeᵀᴹ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.