我需要有关表定义中的问题的帮助:我有一个将被定义的表,例如,像这样:
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
答案 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`)
它有效!
编辑:如果有人需要此提示,请不要忘记创建更新触发器,否则更新请求可能会破坏该机制。