2012-08-15 14 views
53

以下のテーブル構造はエラーを示しています:参照されたテーブルに与えられたキーと一致する一意の制約はなく、この状況でこのエラーがなぜ発生するのか理解できません。上記のコードを実行するERRORの原因:参照されたテーブルに与えられたキーに一致する一意の制約はありませんか?

BEGIN; 

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 (foo_fk,name) 
); 

CREATE TABLE baz( 
    pkey   SERIAL PRIMARY KEY, 
    bar_fk   VARCHAR(256) NOT NULL REFERENCES bar(name), 
    name   VARCHAR(256) 
); 

COMMIT; 

は私には意味がありません。次のエラーを与える、このエラーが発生する理由を誰もが説明できます。私はあなたのbarテーブルにあなたがunique (name)インデックスを持っている必要がありますので、すべての外部キーは、親テーブルのユニークキーを参照する必要がありますpostgresの9.1

PostgreSQLで
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "foo_pkey" for table "foo" 
NOTICE: CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey" 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "bar_pkey" for table "bar" 
NOTICE: CREATE TABLE/UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar" 
NOTICE: CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey" 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "baz_pkey" for table "baz" 
ERROR: there is no unique constraint matching given keys for referenced table "bar" 


********** Error ********** 

ERROR: there is no unique constraint matching given keys for referenced table "bar" 
SQL state: 42830 

答えて

63

テーブルのname列には、UNIQUEという制約がありません。

は、だから、それが一致する2つの行がありますので、参考になりbar上の行名'ams'が含まれていると、あなたがbar_fk'ams'baz上の行を挿入barテーブル、上の2行を持って想像しますか?あなたの定義は、ビット複合主キーがddl constraintsを参照してくださいどのようなものであるか、次に行ったようにあなたは、テーブル・レベルの制約としてUNIQUEを行う際に、ここで抽出

"This specifies that the *combination* of values in the indicated columns is unique across the whole table, though any one of the columns need not be (and ordinarily isn't) unique." 

があり、これはどちらかのフィールドは、おそらく可能性があることを意味し

42

を使用しています。

Finally, we should mention that a foreign key must reference columns that either are a primary key or form a unique constraint.

強調鉱山:

http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK、具体的に参照してください。

+7

なぜ宣言されたPKは一意の制約と見なされませんか?非ユニークなPKを持つことはできません。 – amphibient

+0

データベースエンジンは、実際に参照している行を知る方法がないため、「指す」テーブル上で一意でなければなりません。 –

4

の組み合わせがであり、これが外部キー制約と一致しない場合は、一意の値が一意ではありません。

ほとんどの場合、制約は列レベルにすることをお勧めします。テーブルレベルの制約として定義する代わりに、name VARCHAR(60) NOT NULL UNIQUEのように列定義の末尾に「UNIQUEを追加」するか、フィールドごとに個別のテーブルレベル制約を指定します。

+0

私の状況でのカラムレベルの制約は機能しません私は実際に複合主キーを定義する必要がありますが、私はそれをJPAにそれをマッピングするために少し痛み:) – ams

1

固有の制約として名前列が必要です。ここでは、コードの3行が

は、主キー制約を見つける1.Firstあなたの問題このコードを入力して変更することです

\ dはtable_nameの

あなたは下 「some_constraint」で次のように示されています制約2.drop PRIMARY KEY、Bツリー(カラム)

ALTERテーブルtable_name DROP制約some_constraint

3。新しい主キー列に既存の列を追加します。

ALTER TABLE table_name ADD CONSTRAINT some_constraint PRIMARY KEY(COLUMN_NAME1、COLUMN_NAME2);

すべてです。

関連する問題