MySQL 唯一 key/constraint 值对,无论它们在哪一列

MySQL unique key/constraint for pair of values regardless of which column they're in

如何将唯一密钥应用于以下 table 和要求?

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) 作为新行 - 因为它在逻辑上是重复记录。

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

Keep 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 的子关系。

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

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