【问题标题】:Mysql unique constraint over two columns with irrelevant orderMysql对两列具有不相关顺序的唯一约束
【发布时间】:2014-03-07 16:51:27
【问题描述】:

假设我有一个“游戏”桌,其中有一对有序的 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。

【问题讨论】:

    标签: mysql unique-key


    【解决方案1】:

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

    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;
    

    因为手边没有mysql机器,所以在sqlite中测试过。。。希望在mysql中能用。

    最好的...

    附言周四见!

    【讨论】:

    • 这是个好主意。我已经用我在问题中概述的方法解决了这个问题。我仍然认为你的回答是正确的。
    猜你喜欢
    • 2017-11-04
    • 2012-07-10
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2020-10-12
    相关资源
    最近更新 更多