表相互引用解决方法
Tables referencing each other workaround
我有两个 table(简体):
+-------------+--------------+----------------------------+
| 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) |
+-------------+--------------+----------------------------+
它们代表新闻提要文章。每篇文章都可以有多个修订(更改)。我需要以某种方式指定 article table 中使用的当前修订(可以使用 pending 修订,仅一次一个)。但它会是循环引用。这种情况有什么解决方法吗?
没有什么可以阻止您添加循环外键引用。
要处理它们,您只需确保在每个语句或事务结束时,满足所有约束:
如果使用正常的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;
我有两个 table(简体):
+-------------+--------------+----------------------------+
| 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) |
+-------------+--------------+----------------------------+
它们代表新闻提要文章。每篇文章都可以有多个修订(更改)。我需要以某种方式指定 article table 中使用的当前修订(可以使用 pending 修订,仅一次一个)。但它会是循环引用。这种情况有什么解决方法吗?
没有什么可以阻止您添加循环外键引用。
要处理它们,您只需确保在每个语句或事务结束时,满足所有约束:
如果使用正常的
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;