首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >值对的MySQL唯一键/约束,无论它们位于哪一列

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

Stack Overflow用户
提问于 2018-06-08 03:47:32
回答 2查看 31关注 0票数 0

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

代码语言:javascript
复制
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)作为新行-因为它在逻辑上是重复的记录。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-08 04:39:47

使用更容易接受的解决方案,您始终可以使用触发器来模拟约束。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-08 04:33:46

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

代码语言:javascript
复制
CHECK (item_id < friend_id)
CONSTRAINT UC_item_friend UNIQUE (item_id, friend_id)

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

纯粹主义者可能会反对这种技术,认为应该在friend_ids和item_ids之间建立一个子关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档