sql - PostgreSQL - 在另一个表中不存在的地方插入/反向外键?
问题描述
我有两个表:在 PostgreSQL 数据库Records
中Notifications
逻辑流程是我将收到许多消息,这些消息将存储到Notifications
表中。Records
每隔一段时间,我都会将所有通知按一个公共标识符分组,然后将该标识符作为主键存储一行到表中。
问题是,稍后,我可能仍会收到具有相同标识符的通知,但如果我已经为其创建了记录,我想忽略它们。
notifications
所以我的问题是 -只有当标识符没有出现在表中时,有没有一种有条件地插入的好方法Records
?我正在考虑一个“反向外键”,如果列确实出现在另一个表中,它将无法插入。
我知道这个 SQL 不起作用,但我试图让这样的事情发生:
INSERT INTO notifications (id, notification, timestamp)
values (:id, :notification, now())
WHERE records DOES NOT HAVE :id
解决方案
你可以用一个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)
推荐阅读
- google-cloud-platform - 无法访问 GCP 深度学习 VM 上的 Jupyter Notebook 实例
- laravel - 如何在 laravel nwidart 中编译资产?
- ajax - 使用 ajax 从待处理的 Web 服务获取响应
- python - 新手,使用网络抓取从网站中提取图像时出现值错误
- java - Java 8 - 如何从文件中读取行并将其有条件地存储到数组中
- java - Jenkins Maven 编码和语言
- c# - 如果从 Parallel.ForEach 中创建,任务在哪个线程上运行?
- eclipse - 如何在 Eclipse IDE 中自动添加插件
- javascript - 我怎样才能有一个 for 循环,其中每个数字在迭代中将自己添加到下一个数字?
- python - Python:在现有 MIDI 文件中或在转换为 WAVE 文件期间指定乐器?