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_id
和 friend_id
都与同一个父字段(外键)相关。 friend_id
、item_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 的回答会更清晰。
如何将唯一密钥应用于以下 table 和要求?
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) 作为新行 - 因为它在逻辑上是重复记录。
现在,如何向此 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 的回答会更清晰。