2017-10-01 17 views
0

私はポストグルの同じベーステーブルに多対多のアソシエーションを設定しようとしています。Postgresが同じベーステーブルの多対多の関係

私はこのクエリに少し気をつけています。特に以下のエラーメッセージが表示されます。

エラー

ERROR: insert or update on table "link" violates foreign key constraint "link_primaryid_fkey" SQL state: 23503 Detail: Key (primaryid)=(2) is not present in table "entity".

私はPrimaryId列が(それがない)Linkテーブルに存在することが期待されます。しかし、エラーは、PrimaryId列は、私が避けようとしているベースEntityテーブルに存在する必要が示唆されているようです。

誰でも正しい方向に向けることができますか?スクリプトはどこにでも

+0

おかげで、私は同じケースを使用して、まだ同じ問題を抱えているすべてのものを作ってみました。私はまだ何か間違っているように見えますか? – crazygravy89

+2

https://www.postgresql.org/docs/current/static/ddl-inherit.html#DDL-INHERIT-CAVEATS "*継承機能の深刻な制限は、インデックス(一意制約を含む)と外部キー制約のみです* "..." *別のテーブルの列 'REFERENCES cities(name)'を指定すると、他のテーブルには都市名が含まれ、大文字名は含まれないようにすることができます。この場合は* " – melpomene

答えて

1

外部キーが動作しない感謝を絶対ケース(")を使用するように更新さ

--- Create Tables 
CREATE TABLE "Entity" ("Id" SERIAL PRIMARY KEY); 
CREATE TABLE "Task" ("Name" TEXT) INHERITS ("Entity"); 
CREATE TABLE "Project" ("Name" TEXT) INHERITS ("Entity"); 

--- Create mock data 
INSERT INTO "Task" ("Name") VALUES ('Foo'); 
INSERT INTO "Project" ("Name") VALUES ('Bar'); 

-- Create Link Table 
CREATE TABLE "Link" (
    "PrimaryId" INTEGER REFERENCES "Entity" ("Id") 
        ON UPDATE CASCADE 
        ON DELETE CASCADE, 
    "SecondaryId" INTEGER REFERENCES "Entity"("Id") 
      ON UPDATE CASCADE 
        ON DELETE CASCADE, 
    PRIMARY KEY ("PrimaryId", "SecondaryId") 
); 

--- Create Associations. It errors here 
INSERT INTO "Link" ("PrimaryId", "SecondaryId") VALUES (2, 1) 

アップデート1

を高速化するために立ち上がっする

彼らが目の当たりにしているように、相続財産を持っている継承されたテーブルではなく、基本テーブルの内容。

特にhttps://www.postgresql.org/docs/9.6/static/ddl-inherit.htmlとを参照してください。コメントwildplasserため

A serious limitation of the inheritance feature is that indexes (including unique constraints) and foreign key constraints only apply to single tables, not to their inheritance children. This is true on both the referencing and referenced sides of a foreign key constraint. Thus, in the terms of the above example:

(...)

  • Specifying that another table's column REFERENCES cities(name) would allow the other table to contain city names, but not capital names. There is no good workaround for this case.
+0

ああ、ありがとう!興味のある人には、これに基づいていくつかの追加情報が見つかりました。 https://stackoverflow.com/a/24361724/8703418 "短いバージョン:外部キーまたはテーブル継承を使用できますが、両方を使用することはできません。これは本質的に不可能ではなく、技術的に非常に困難ですPostgreSQLの継承テーブルを一貫して高速かつ信頼できる方法で実装するためのユニークなインデックスを実装することができます。 – crazygravy89