postgresql SQL -如何对特定值进行唯一约束?

83qze16e  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(158)

我想创建一个Postgres表如下:

# First creating enum type
CREATE TYPE POST_TYPE AS ENUM ( 'question', 'option', 'answer')

# Now creating table
CREATE TABLE QNA (
    ...,
    post_id int,
    type POST_TYPE,
    description VARCHAR(100),
    ...
)

其中post_id是外键。我想做的是:

  • 我应该能够添加每个外键只有1个问题。也就是说,(post_id,type)应该是唯一的,只有在type == 'question'的情况下。
  • 如果type是别的什么,它不需要是唯一的。

例如,对于post_id 123:
首次插入:(...,123,'question',“",...)->应该成功。
第二次插入:(...,123,'question',“",...)->应该失败。
也是为了类型!= 'question'
insertion:(...,123,'option',“",...)->应该成功,无论插入多少次。
我的仓库已经按照这个逻辑构建了,所以我不想改变模式。有什么方法可以在SQL /PostgreSQL中添加此约束吗?
我试着让(post_id,type)一起唯一,但这不允许我每个post_id有多个'option'。

sz81bmfz

sz81bmfz1#

一个解决方案是创建一个唯一的部分索引,如下所示:

CREATE UNIQUE INDEX qna_questions_uk ON qna(post_id) WHERE type = 'question';

这将解决已发布的问题;然而,应修订该模型,以便解决选项和答案与问题相关的隐含限制。应该使用外键来强制执行这些约束,但是示例模型禁止使用它们。问题、选项和答案是不同的概念。将它们建模为单个表会模糊这一点。

相关问题