2 つの表が互いを参照する

表 a が b を、表 b が a を、どちらも NOT NULL の列で参照する例です。2 表にまたがる循環が 1 組見つかり、緩和の見込みが薄いことを確かめます。

入力

SQL

CREATE TABLE a (id int PRIMARY KEY, b_id int NOT NULL REFERENCES b (id));
CREATE TABLE b (id int PRIMARY KEY, a_id int NOT NULL REFERENCES a (id));

結果

エラー 0 件・警告 1 件・情報 0 件

指摘(エラー・警告・情報)

  • 警告 1 行目 a・b の外部キーが循環している候補です(a(b_id) → b、b(a_id) → a)。外部キーは参照先の行が存在していることを求めるため(CREATE TABLE 文書の REFERENCES)、どの表から作り・入れるかが決まらなくなります。緩和する条件が見当たらないため、どれかの外部キーを NULL 許可にする、DEFERRABLE にする、または設計を見直してください。「候補」の検出であり、実際の登録順は業務の流れで確認してください。
表の数2 個
外部キーの数2 本
複数の表にまたがる循環1 組
自己参照0 表

循環の候補

循環の候補
#循環に含まれる表参照の向き(子 → 親)緩和の見込み
1a ⇄ ba(b_id) → b / b(a_id) → a全ての辺が NULL 不可・即時検査のため、緩和されにくい

検算(この結果になる理由)

a の b_id は b を、b の a_id は a を参照するので辺は a → b と b → a の 2 本で、a と b は輪になります。どちらの列も NOT NULL で DEFERRABLE もないため、緩和されにくいと表示され、警告が 1 件出ます。

判定の根拠は仕様と根拠に、仕様の出典とともにまとめています。自分の入力で試すにはツールをお使いください。

このツールの制約

ご利用にあたって

  • 結果は字句の読み取りにもとづく確認で、実際のデータベースでの解釈を保証するものではありません。
  • ドキュメントは PostgreSQL License で公開されています。このサイトはその内容を要約して参照しており、転載はしていません。

ほかの入力例