如何判断哪些外键是循环的?正如 pg_dump 的警告所强调的那样

bax*_*axx 2 postgresql foreign-key timescaledb

pg_dump当在本地容器中运行的(时间尺度)数据库上执行时,我有以下内容:

pg_dump: warning: there are circular foreign-key constraints on this table:
pg_dump:   hypertable
Run Code Online (Sandbox Code Playgroud)

我为上述运行的命令:

pg_dump --schema-only -h localhost --port 5432 --dbname db --username user > schema.sql
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用 postgres 检查哪些键是循环的。

我可以浏览所有表格并手动跟踪哪些键指向我猜测的 - 但我希望有一种更直接的方法来确定哪些键是循环的以及在哪里,以便我可以修复它们。

Lau*_*lbe 6

仅在仅使用数据转储时才会收到此警告,并且由于仅列出了一个表,因此该表必须有一个引用自身的外键。

您可以使用以下命令找到所有此类外键约束

SELECT conrelid::regclass AS table_name,
       conname AS constraint_name
FROM pg_constraint
WHERE contype = 'f'
  AND conrelid = confrelid;
Run Code Online (Sandbox Code Playgroud)

您可以执行以下几项操作:

  • 不要执行仅数据转储。如果您也转储 DDL 语句(并且可能使用该--clean选项),则循环外键没有问题,因为数据将在创建约束之前恢复。

  • 在恢复转储之前删除外键,然后再创建它。

  • 在恢复转储之前禁用表上的所有外键 ant 触发器:

    ALTER TABLE tab DISABLE TRIGGER ALL;
    
    Run Code Online (Sandbox Code Playgroud)

    之后,您可以使用以下命令重新激活它们

    ALTER TABLE tab ENABLE TRIGGER ALL;
    
    Run Code Online (Sandbox Code Playgroud)

    您需要成为超级用户才能执行此操作,因为这可能会破坏一致性。

  • 谢谢 - 我添加了用于OP的命令,它带有一个“仅模式”标志到“pg_dump”而不是“仅数据” (2认同)