gpt4 book ai didi

Mysql 对具有不相关顺序的两列的唯一约束

转载 作者:行者123 更新时间:2023-11-29 01:58:14 25 4
gpt4 key购买 nike

假设我有一个“游戏”表,其中有一对有序的 2 名参与者:

id | make | party1_id | party2_id

现在我想像这样填写表格:

INSERT INTO game (party1_id, party2_id) VALUES (1, 2); -- OK
INSERT INTO game (party1_id, party2_id) VALUES (4, 3); -- OK
INSERT INTO game (party1_id, party2_id) VALUES (2, 4); -- OK
INSERT INTO game (party1_id, party2_id) VALUES (2, 1); -> should fail

最后一次尝试应该会失败,因为有两个参与者的游戏已经存在,尽管玩家顺序不同。我不能强制表格按照 ID 的顺序保存 party1_id 和 party2_id,因为它们有一些意义(主场球员与客场球员)。

所以问题是,我们能否在 MySQL 中创建适用于我的情况的 UNIQUE 约束?

到目前为止,我认为我可以创建一个生成的列,其中两个 ID 按升序排列作为连接字符串,并在它们上放置一个唯一索引(例如第一行的“1_2”)。然而,这似乎有点尴尬。

我看到了another question related to this , 但不适用于 MySQL。

最佳答案

我想知道这个触发器是否可以解决问题:

CREATE TABLE game(
party1_id INTEGER,
party2_id INTEGER,
CONSTRAINT p12_unique UNIQUE (party1_id, party2_id));

CREATE TRIGGER no_way BEFORE insert ON game
BEGIN
SELECT RAISE(ABORT, 'There can be only one.')
WHERE EXISTS (SELECT 1
FROM game
WHERE
party1_id = new.party2_id AND
party2_id = new.party1_id);
END;


/* Create few records in this table */
INSERT INTO game (party1_id, party2_id) VALUES (1, 2);
INSERT INTO game (party1_id, party2_id) VALUES (4, 3);
INSERT INTO game (party1_id, party2_id) VALUES (2, 4);
INSERT INTO game (party1_id, party2_id) VALUES (1, 2); /* fail */
INSERT INTO game (party1_id, party2_id) VALUES (2, 1); /* fail */
INSERT INTO game (party1_id, party2_id) VALUES (4, 2); /* fail */

COMMIT;

/* Display all the records from the table */
SELECT * FROM game;

它是在 sqlite 中测试的,因为我手头没有 mysql 机器......我希望它能在 mysql 中工作。

最好的...

附注周四见!

关于Mysql 对具有不相关顺序的两列的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com