SQLite对多列没有顺序的唯一约束

时间:2017-06-03 16:41:57

标签: sql sqlite unique-constraint

我需要有关表定义中的问题的帮助:我有一个将被定义的表,例如,像这样:

  • id,主键
  • friend0_id,表users
  • 上的外键
  • friend1_id,表users
  • 上的外键

问题是我不希望夫妻(friend0_id, friend1_id)多次出现,无论表格中的顺序如何。

我尝试在夫妻UNIQUE上定义(friend0_id, friend1_id)约束,但约束中定义的列顺序(此处friend0_id,那么friend1_id)很重要。所以:

| id | friend0_id | friend1_id |
|----|------------|------------|
| 1  |      3     |      4     | -> OK
| 2  |      4     |      3     | -> OK, as the columns order in index matters
| 3  |      3     |      4     | -> Not OK, constraint prevent this

我希望不允许示例中的id 2和3,但我无法弄清楚如何。你有一些技巧吗?

谢谢你, naccyde

1 个答案:

答案 0 :(得分:3)

正如@mu too short所提到的,方法是使用(greatest(friend0_id, friend1_id), least(friend0_id, friend1_id)),所以,现在我有一个工作2列的订单免费唯一约束。我用SQLite这样做了(这可能不是更好):

  • 创建一个触发器,将min(friend0_id, friend1_id)设置为friend0,将max(friend0_id, friend1_id)设置为friend1

    CREATE TRIGGER friend_fixed_id_order_trigger
    AFTER INSERT ON friends 
    BEGIN UPDATE friends 
      SET 
        friend0_id = min(NEW.friend0_id, NEW.friend1_id), 
        friend1_id = max(NEW.friend0_id, NEW.friend1_id) 
      WHERE friends.id = NEW.id; 
    END
    
  • 然后,为情侣(friend0_id, friend1_id)

    设置一个唯一约束
    CREATE UNIQUE INDEX `friends_unique_relation_index` 
    ON `contacts` (`friend0_id` ,`friend1_id`)
    

它有效!

编辑:如果有人需要此提示,请不要忘记创建更新触发器,否则更新请求可能会破坏该机制。