如何将唯一键应用于下表和要求?
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)作为新行-因为它在逻辑上是重复的记录。
现在,如何将唯一键或一些约束添加到此表中?
发布于 2018-06-08 04:39:47
使用更容易接受的解决方案,您始终可以使用触发器来模拟约束。
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的答案就清晰多了。
发布于 2018-06-08 04:33:46
保留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之间建立一个子关系。
https://stackoverflow.com/questions/50749159
复制相似问题