MySQL уникальный ключ / ограничение для пары значений независимо от того, в каком столбце они находятся - PullRequest
0 голосов
/ 07 июня 2018

Как применить уникальный ключ к следующей таблице и требованиям?

CREATE TABLE `friends` (
  `item_id` VARCHAR(36) NOT NULL,
  `friend_id` VARCHAR(36) NOT NULL,
);

Здесь item_id и friend_id оба относятся к одному и тому же родительскому полю (внешний ключ).Не имеет значения, если friend_id, item_id появляются в порядке, потому что это также означает то же самое.

Например, если значения (5, 7) появляются в строке, он не должен принимать (7, 5) как новая строка - потому что это логически дублирующаяся запись.

Теперь, как мне добавить уникальный ключ или некоторые ограничения к этой таблице?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Обнажая более приемлемое решение, вы всегда можете смоделировать ограничение с помощью триггера.

create trigger chk_friends_unique before update on friends
  for each row 
   begin  
    if (exists(
      SELECT 1 FROM friends WHERE 
        (friend_id = new.item_id AND item_id = new.friend_id)
        OR (item_id = new.item_id AND friend_id = new.friend_id)
    )) then
      SIGNAL SQLSTATE '45000'   
      SET MESSAGE_TEXT = 'Unique constrain violated';
    end if; 
   end; 

Если честно, если вы справитесь с ограничением порядка, то ответ @Joop Eggen намного чище.

0 голосов
/ 07 июня 2018

Сохранить item_id < friend_id, что можно сделать с ограничением CHECK.Это удаляет избыточность (7, 5) из (5, 7).

CHECK (item_id < friend_id)
CONSTRAINT UC_item_friend UNIQUE (item_id, friend_id)

Соответственно, код должен соблюдать осторожность, чтобы сохранить этот порядок.

Пуристы могут возразить против этой техники, чтодолжна быть сделана взаимосвязь friend_ids и item_ids.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...