CREATE TABLE tablename (
a INT NOT NULL,
b INT NOT NULL,
x INT GENERATED ALWAYS AS (LEAST(a, b)),
y INT GENERATED ALWAYS AS (GREATEST(a, b)),
UNIQUE (x, y)
);
if (exists(
select 1
from t
where (least(a, b), greatest(a, b)) = (least(new.a, new.b), greatest(new.a, new.b))
)) then
signal sqlstate value '45000' set message_text = 'cannot insert duplicate pair';
end if;
一个简单的解决方案是在表中添加CHECK约束沿着UNIQUE:
alter table t add constraint unique (a, b)
alter table t add constraint check (a < b)
4条答案
按热度按时间ttygqcqt1#
定义2个虚拟生成列,分别使用2个值中的最小值和最大值,并对它们设置唯一约束:
参见demo。
或者,对于MySql 8.0+:
参见demo。
rta7y2nd2#
你可以用触发器强制执行。但是我想不出一个好的方法来用UNIQUE KEY约束来实现这一点。
如果您更改存储值的方式,使它们位于一个单独的列中,位于另一个表的多个行中,则会更容易。然后你可以很容易地使用UNIQUE KEY来强制唯一性。
如果您尝试表示相关项目:
如果您需要每个成员只出现在一个组中:
xam8gpfp3#
有第三列
hash VARCHAR NOT NULL UNIQUE
,在那里你可以放置排序的哈希。对它进行排序,以始终获得相同的哈希值,无论它们的顺序如何:1, 2, 2, 3
将具有与3, 2, 1, 2
相同的哈希例如,在PHP中:
x6yk4ghg4#
插入数据时,使用插入前触发器检查重复项,如下所示:
一个简单的解决方案是在表中添加
CHECK
约束沿着UNIQUE
:现在,您必须存储数据,以便
a < b
。如果您尝试插入2, 1
,检查将失败。如果插入1, 2
,则唯一约束失败。DB<>Fiddle