首页 > 解决方案 > PostgreSQL - 在另一个表中不存在的地方插入/反向外键?

问题描述

我有两个表:在 PostgreSQL 数据库RecordsNotifications

逻辑流程是我将收到许多消息,这些消息将存储到Notifications表中。Records每隔一段时间,我都会将所有通知按一个公共标识符分组,然后将该标识符作为主键存储一行到表中。

问题是,稍后,我可能仍会收到具有相同标识符的通知,但如果我已经为其创建了记录,我想忽略它们。

notifications所以我的问题是 -只有当标识符没有出现在表中时,有没有一种有条件地插入的好方法Records?我正在考虑一个“反向外键”,如果列确实出现在另一个表中,它将无法插入。

我知道这个 SQL 不起作用,但我试图让这样的事情发生:

INSERT INTO notifications (id, notification, timestamp) 
values (:id, :notification, now()) 
WHERE records DOES NOT HAVE :id

标签: sqlpostgresqlforeign-keyssubquerysql-insert

解决方案


你可以用一个insert ... select语句来表达这一点:

INSERT INTO notifications (id, notification, timestamp) 
SELECT s.*, now()
FROM (VALUES (:id, :notification)) AS s(id, notification)
WHERE NOT EXISTS (SELECT 1 FROM records r WHERE r.id = s.id)

推荐阅读