如何将唯一键应用于下表和要求?
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)作为新行 - 因为它在逻辑上是重复记录。
现在,如何在此表中添加唯一键或一些约束?
答案 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的回答会更加清晰。