postgresql - 表相互引用解决方法
问题描述
我有两个表(简化):
+-------------+--------------+----------------------------+
| article |
+-------------+--------------+----------------------------+
| id | int | PRIMARY KEY AUTO_INCREMENT |
| author | int | FK (users) |
| created_at | date | |
| revision | int | FK (article_revision) |
+-------------+--------------+----------------------------+
+-------------+--------------+----------------------------+
| article_revision |
+-------------+--------------+----------------------------+
| id | int | PRIMARY KEY AUTO_INCREMENT |
| title | text | |
| content | text | |
| article_id | int | FOREIGN KEY (article) |
+-------------+--------------+----------------------------+
它们代表新闻提要文章。每篇文章都可以有多个修订(更改)。我需要以某种方式从使用的文章表中指定一个当前修订版(可能有可以使用的待定修订版,当时只有一个)。但这将是循环引用。这种情况有什么解决方法吗?
解决方案
没有什么可以阻止您添加循环外键引用。
要处理它们,您只需要确保在每个语句或事务结束时,所有约束都得到满足:
如果您使用普通
NOT DEFERRABLE
约束,则必须在单个语句中修改两个表:WITH current_revision AS ( INSERT INTO article_revision VALUES (...) RETURNING id ) UPDATE article FROM current_revision SET revision = current_revision.id WHERE ...;
使用
DEFERRABLE
外键,检查被推迟到事务结束:BEGIN; INSERT INTO article_revision VALUES (...) RETURNING id; UPDATE article SET revision = ... WHERE ...; COMMIT;
推荐阅读
- kotlin - 是否有范围函数返回先前的值?
- java - onbackpressed 后关闭对话框窗口
- r - sm.ancova 的事后检验(非参数 ancova)
- javascript - 如何使用javascript或jquery根据输入文本触发列表?
- php - Laravel 8:如何设置所有枚举值的默认值
- java - 如何在 HttpURLConnection 中将文件作为二进制请求而不是表单数据发送到 put 请求中?
- python - 在 Docker 上安装 Poetry 失败
- glassfish-5 - 带有 glassFish6 的 Netbeans 12.4 - 无法构建简单的 hello1 应用程序
- mongodb - 在 Mongo DB 中查找所有具有重复值的对象
- r - 每个条件的 NA 数量