Mysql的超过两列不相干为了唯一约束

问题描述:

假设我有一个有序对2名人参加的“游戏”表:Mysql的超过两列不相干为了唯一约束

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。

最好...

p.s.星期四见!

+0

这是一个好主意。我已经用我在问题中概述的方法解决了这个问题。我仍然接受你的回答是正确的。 – luksch