ホームページ > データベース > mysql チュートリアル > Postgres 9.1 の外部キー参照が「一意制約」エラーで失敗するのはなぜですか?

Postgres 9.1 の外部キー参照が「一意制約」エラーで失敗するのはなぜですか?

Patricia Arquette
リリース: 2025-01-08 22:22:45
オリジナル
741 人が閲覧しました

Why Does My Postgres 9.1 Foreign Key Reference Fail with a

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>
ログイン後にコピー
ここで、baz テーブルに行を挿入し、bar テーブル内のあいまいな ams 値を参照しようとすると、PostgreSQL はターゲット行を一意に識別できません。このあいまいさは、PostgreSQL が外部キーによってバー テーブル内のどの行を参照すべきかを判断できないために発生します。

解決策は、バーテーブルの名前列の一意性を強制することです。 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>
ログイン後にコピー
この一意制約により、PostgreSQL はテーブル構造を正常に作成し、「指定されたキーに一致する一意制約がありません」エラーを回避できるようになりました。

以上がPostgres 9.1 の外部キー参照が「一意制約」エラーで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート