我想创建一个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'。
1条答案
按热度按时间sz81bmfz1#
一个解决方案是创建一个唯一的部分索引,如下所示:
这将解决已发布的问题;然而,应修订该模型,以便解决选项和答案与问题相关的隐含限制。应该使用外键来强制执行这些约束,但是示例模型禁止使用它们。问题、选项和答案是不同的概念。将它们建模为单个表会模糊这一点。