你的唯一索引,后来被编辑掉了。
CREATE UNIQUE INDEX feedback_unique_user_subject_and_sale_null
ON feedback(user_id, subject_id, sale_id)
WHERE deleted_at IS NULL
您的唯一索引至少有两个可能会给您带来麻烦的副作用。
- 在其他表中,您不能设置引用“反馈”的外键约束。外键引用需要将某些列组合声明为
primary key
or 或unique
。
- 您的唯一索引允许仅在“deleted_at”时间戳不同的多行。因此,最终可能会得到如下例所示的行。这是否是一个问题取决于应用程序。
例子
user_id subject_id sale_id deleted_at
--
1 1 1 2012-01-01 08:00:01.33
1 1 1 2012-01-01 08:00:01.34
1 1 1 2012-01-01 08:00:01.35
PostgreSQL 将这种索引记录为部分索引,如果您需要在某个时候谷歌它。其他平台对它使用不同的术语——过滤索引就是其中之一。您可以使用一对部分索引将问题限制在一定程度上。
CREATE UNIQUE INDEX feedback_unique_user_subject_and_sale_null
ON feedback(user_id, subject_id, sale_id)
WHERE deleted_at IS NULL
CREATE UNIQUE INDEX feedback_unique_user_subject_and_sale_not_null
ON feedback(user_id, subject_id, sale_id)
WHERE deleted_at IS NOT NULL
但我认为没有理由去这么麻烦,特别是考虑到外键的潜在问题。如果你的桌子看起来像这样
create table feedback (
feedback_id integer primary key,
user_id ...
subject_id ...
sale_id ...
deleted_at ...
constraint unique_user_subj_sale
unique (user_id, subject_id, sale_id)
);
那么您所需要的就是对 {user_id, subject_id, sale_id} 的唯一约束。您可能会进一步考虑让所有删除都使用“deleted_at”列,而不是进行硬删除。