问题的简短版本:我想将PostgreSQL表中的数据限制为零或一个记录,其中包含两个字段的唯一组合,而另一个表中没有数据引用它。
我有一个名为draft_outlooks的预测表(outlooks),用于存储用户通过网络应用撰写的草稿文本。这些展望属于一个区域,存储在名为outlook_areas的表中。这是表定义:
CREATE TABLE draft_outlooks
(
objectid serial PRIMARY KEY,
guid varchar(38) NOT NULL UNIQUE,
outlook_area_objectid int NOT NULL REFERENCES outlooks.outlook_areas (objectid),
forecast_date date NOT NULL,
json_content jsonb NOT NULL
)
当用户完成后,将发布outlook,并将记录放入名为published_outlooks的表中。该表如下所示:
CREATE TABLE published_outlooks
(
objectid serial PRIMARY KEY,
guid varchar(38) NOT NULL UNIQUE,
draft_outlook_objectid int NOT NULL
REFERENCES outlooks.draft_outlooks (objectid) UNIQUE,
forecast_date date NOT NULL,
[...plus various fields to hold the user-entered text...]
)
draft_outlook记录与outlook_area_objectid和forecast_date有关,但可以在用户更新时多次发布,因此我无法对其进行唯一性处理。我想要实现的是,展望区域和预测日期组合只能有一个 未发布的 draft_outlook记录。因此,它是唯一的outlook_area_objectid和forecast_date的组合,加上published_outlooks中相应记录的 缺席 。
实现这一目标的最简单方法是什么?我的组织具有最低限度的SQL技能,所以我试图坚持最简单的解决方案,因此我的同事了解我为他们设置的任何内容。检查约束是否可以在另一个表中查找没有引用记录?我的研究表明,我需要添加另一个字段来草拟outlook以使用常规检查约束,或者我需要使用触发器。
谢谢!