表相互引用解决方法

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;