对于值对的MySQL唯一键/约束,无论它们属于哪个列

时间:2018-06-07 19:47:32

标签: mysql unique-key

如何将唯一键应用于下表和要求?

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

此处,item_idfriend_id都与相同的父字段(外键)相关。如果friend_iditem_id按顺序出现并不重要,因为它也意味着相同。

例如,如果值(5,7)出现在行中,则不应接受(7,5)作为新行 - 因为它在逻辑上是重复记录。

现在,如何在此表中添加唯一键或一些约束?

2 个答案:

答案 0 :(得分:1)

保留item_id < friend_id可以使用CHECK约束完成。 这从(5,7)中删除了冗余(7,5)。

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

相应地,代码必须小心保持这个顺序。

纯粹主义者可能反对这种技术,即应该建立friend_ids和item_ids的子关系。

答案 1 :(得分:0)

Baring一个更可口的解决方案,您始终可以使用触发器来模拟约束。

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的回答会更加清晰。