親を指す自己参照
同じ表の中で親の id を参照する階層構造の例です。複数表の循環ではなく自己参照として、情報で示されることを確かめます。
入力
SQL
CREATE TABLE t (id int PRIMARY KEY, parent_id int REFERENCES t (id));
結果
エラー 0 件・警告 0 件・情報 1 件
指摘(エラー・警告・情報)
- 情報 1 行目 t は自分自身を参照しています(自己参照)。階層構造(親子)では普通の形です。参照列が NULL を許可すれば、最上位の行を先に入れられます。
| 表の数 | 1 個 |
|---|---|
| 外部キーの数 | 1 本 |
| 複数の表にまたがる循環 | 0 組 |
| 自己参照 | 1 表 |
循環の候補
| # | 循環に含まれる表 | 参照の向き(子 → 親) | 緩和の見込み |
|---|---|---|---|
| 1 | t(自己参照) | t(parent_id) → t | 緩和できる可能性あり: t(parent_id) → t(列が NULL 許可) |
検算(この結果になる理由)
parent_id は同じ表 t の id を参照するので、t から t への辺ができ自己参照です。parent_id は何も付いておらず NULL を許可するため、最上位の行を先に入れられます(CREATE TABLE 文書)。情報が 1 件出ます。
判定の根拠は仕様と根拠に、仕様の出典とともにまとめています。自分の入力で試すにはツールをお使いください。
このツールの制約
- 完全な SQL の構文解析はしません。貼られていない表の参照は先をたどれず、循環を見逃すことがあります(その旨を情報で示します)。
- 「候補」の検出です。業務の流れ(どの表に先にデータが入るか)までは判定しません。
- 自己参照(階層構造の親子)は多くの設計で普通の形のため、複数の表にまたがる循環とは区別して情報で示します。
- CREATE TABLE ... AS などの列定義のない形は読みません。ALTER TABLE は ADD [CONSTRAINT] FOREIGN KEY だけを読みます。
ご利用にあたって
- 結果は字句の読み取りにもとづく確認で、実際のデータベースでの解釈を保証するものではありません。
- ドキュメントは PostgreSQL License で公開されています。このサイトはその内容を要約して参照しており、転載はしていません。