检查另一个表中缺少数据的约束

时间:2018-02-13 18:01:26

标签: postgresql constraints unique

问题的简短版本:我想将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以使用常规检查约束,或者我需要使用触发器。

谢谢!

0 个答案:

没有答案