mysql 唯一行,无论列如何

xdnvmnnf  于 2023-06-04  发布在  Mysql
关注(0)|答案(4)|浏览(398)

有没有一种方法可以使整行都是唯一的,而不管列的值是什么?
因此,如果1在col a中,而2在col b中,那么如果您要将2插入col a,并将1插入col b,则会抛出错误。

+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 2 | 1 | <- Would throw error on insert since this already exists above
+---+---+
ttygqcqt

ttygqcqt1#

定义2个虚拟生成列,分别使用2个值中的最小值和最大值,并对它们设置唯一约束:

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)
);

参见demo
或者,对于MySql 8.0+:

CREATE TABLE tablename (
  a INT NOT NULL, 
  b INT NOT NULL,
  UNIQUE ((LEAST(a, b)), (GREATEST(a, b))) -- don't miss the parentheses 
);

参见demo

rta7y2nd

rta7y2nd2#

你可以用触发器强制执行。但是我想不出一个好的方法来用UNIQUE KEY约束来实现这一点。
如果您更改存储值的方式,使它们位于一个单独的列中,位于另一个表的多个行中,则会更容易。然后你可以很容易地使用UNIQUE KEY来强制唯一性。
如果您尝试表示相关项目:

CREATE TABLE item_group (
  group_id INT AUTO_INCREMENT PRIMARY KEY
);

CREATE TABLE item_group_members (
  group_id INT NOT NULL,
  member_id INT NOT NULL,
  PRIMARY KEY (group_id, member_id)
);

INSERT INTO item_group_members VALUES (1, 1), (1, 2);

如果您需要每个成员只出现在一个组中:

ALTER TABLE item_group_members ADD UNIQUE KEY (member_id);
xam8gpfp

xam8gpfp3#

有第三列hash VARCHAR NOT NULL UNIQUE,在那里你可以放置排序的哈希。对它进行排序,以始终获得相同的哈希值,无论它们的顺序如何:1, 2, 2, 3将具有与3, 2, 1, 2相同的哈希
例如,在PHP中:

sort($columns);
$hash = md5(implode('|', $columns));

$columns['hash'] = $hash;

$sql = "INSERT INTO my_tbl VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute($columns);
x6yk4ghg

x6yk4ghg4#

插入数据时,使用插入前触发器检查重复项,如下所示:

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)

现在,您必须存储数据,以便a < b。如果您尝试插入2, 1,检查将失败。如果插入1, 2,则唯一约束失败。
DB<>Fiddle

相关问题