mysql值对的唯一键/约束,不管它们在哪一列

o4hqfura  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(332)

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

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)作为新行,因为它在逻辑上是重复的记录。
现在,如何向该表添加唯一键或一些约束?

qybjjes1

qybjjes11#

保持 item_id < friend_id 这可以通过检查约束来完成。这将从(5,7)中删除冗余(7,5)。

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

相应地,代码必须小心地保持这个顺序。
纯粹主义者可能会反对这种技术,认为应该建立friend\u id和item\u id的子关系。

pbwdgjma

pbwdgjma2#

有了一个更容易接受的解决方案,您总是可以通过使用触发器来模拟约束。

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的答案就更清楚了。

相关问题