在一张表中,我有 3 列:
id
tag1
tag2
id 是主键。
我只想要那个表中有一个唯一的 tag1-tag2-组合。
例如,如果一个条目看起来像:
id: 1
tag1: cat
tag2: dog
我不想插入第二个像下面这样的条目:
id: 2
tag1: cat
tag2: dog
所以我做了所有 3 列主键,但问题是第二个条目会被插入,因为它看起来是所有 3 列的组合。
我如何解决这个问题,以便只有 tag1 和 tag2 的组合是唯一的?
更新: 我在 tag1 和 tag2 上添加了一个独特的约束。但是,它仍然可以插入:
id: 3
tag1: dog
tag2: cat
有没有办法防止这种情况?
最佳答案
您应该将 ID 作为主键,然后可以为 tag1 和 tag2 创建唯一约束:
ALTER TABLE my_table ADD CONSTRAINT uc_tags UNIQUE (tag1, tag2)
使用唯一约束,您将确保永远不会有两行具有重复的 tag1 和 tag2 值。
编辑:
继上次更新之后,您无法使用唯一约束来强制执行该更新。请记住,对于数据库,带有 (tag1 = dog, tag2 = cat) 的记录与带有 (tag1 = cat, tag2 = dog) 的记录完全不同。
可能你最好的办法是重新设计你的数据库架构,如下所示:
然后您可以简单地将“tag_messages”表的 (message_id, tag_id) 设置为主键。这将自动强制禁止任何带有重复标签的消息。
一些示例数据:
Table: messages
message_id | title
-------------+------------------
1 | some message
2 | another message
Table: tags
tag_id | tags
-------------+-------------------
1 | cat
2 | dog
3 | duck
4 | horse
Table: messages_tags
message_id | tag_id
-------------+-------------------
1 | 1
1 | 2
2 | 3
2 | 4
2 | 1
关于sql - 帮助处理主键和唯一约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2257846/