PostgreSQL 9.1 外部キー参照の「未解決の一意制約」エラーを解決する
PostgreSQL 9.1 で外部キー参照を含むテーブル構造を作成すると、予期しないエラーが発生する場合があります。このエラーは、矛盾した制約構成が原因で発生します。
問題の SQL コードには、foo、bar、baz の 3 つのテーブルの作成が含まれています。 foo テーブルには name カラムに主キーがありますが、bar テーブルでは foo_fk カラムを foo(name) を参照する外部キーとして定義します。ただし、エラー メッセージは、バー テーブルで参照されている名前列に一意の制約がないことを示しています。
この問題を理解するには、次の例に示すように、棒テーブル内の複数の行が同じ名前の値を共有するシナリオを考えてみましょう。
<code class="language-sql">INSERT INTO bar (foo_fk, name) VALUES ('alice', 'ams'); INSERT INTO bar (foo_fk, name) VALUES ('bob', 'ams');</code>
解決策は、バーテーブルの名前列の一意性を強制することです。 name 列に一意の制約を追加することで、bar テーブルの各行が異なる名前の値を持つようになり、曖昧さがなくなり、PostgreSQL が参照される行を一意に識別できるようになります。
必要な制約を含む修正された SQL コードは次のとおりです:
<code class="language-sql">CREATE TABLE foo ( name VARCHAR(256) PRIMARY KEY ); CREATE TABLE bar ( pkey SERIAL PRIMARY KEY, foo_fk VARCHAR(256) NOT NULL REFERENCES foo(name), name VARCHAR(256) NOT NULL, UNIQUE (name) -- 添加唯一约束 ); CREATE TABLE baz( pkey SERIAL PRIMARY KEY, bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name), name VARCHAR(256) );</code>
以上がPostgres 9.1 の外部キー参照が「一意制約」エラーで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。