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

时间:2014-03-07 16:51:27

标签: mysql unique-key

假设我有一个“游戏”表,其中包含一对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。

1 个答案:

答案 0 :(得分:3)

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

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中运行。

...最佳

P.S。星期四见!