在一张表中,我有 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/

10-16 15:05