3

SQL コードに問題があります。

シーケンスとテーブルの作成、一部のデータの挿入:

CREATE SEQUENCE tmp_id_places START 1;
CREATE SEQUENCE tmp_id_books START 1;

CREATE TABLE tmp_places (
  id int PRIMARY KEY DEFAULT nextval('tmp_id_places'),
  name text
);

CREATE TABLE tmp_cities (population int) INHERITS (tmp_places);
CREATE TABLE tmp_rivers (lenght int) INHERITS (tmp_places);

INSERT INTO tmp_cities (name, population) VALUES
  ('Moscow', 15),
  ('St. Petersburg', 9);

INSERT INTO tmp_rivers (name, lenght) VALUES
  ('Volga', 115),
  ('Angara', 319);

CREATE TABLE tmp_books (
  id int PRIMARY KEY DEFAULT nextval('tmp_id_books'),
  id_place int REFERENCES tmp_places(id),
  title text
); 

このコードはエラーになります:

INSERT INTO tmp_books (title, id_place) VALUES
  ('Some book about Moscow', 1),
  ('Another book about Angara', 4);

テーブルtmp_booksには、場所に関する情報が含まれています。しかし、マスターテーブルtmp_places (子テーブルのすべてのデータ) にデータがないため、データを挿入できません。

それで、これはとにかく解決できますか?

4

3 に答える 3

4

PostrgeSQL ドキュメントのこのセクションを詳しく見てください。子テーブルにデータを挿入する場合、データは子テーブルでのみ見つかります。一方、マスター テーブルに挿入すると、すべての子テーブルでも新しい行が表示されます。そのため、最初は常にマスター テーブルで作業する必要があります。

私は少し前に継承を扱っていましたが、同じ問題に直面していました。私は次のようになりました:

  1. INSERTtmp_places;への新しいエントリ。
  2. UPDATEtmp_citiesたとえば、それぞれの値を持つ追加のフィールド。

7.4 回に戻ると、そのようなアクティビティ用の一連の関数を作成する必要がありました。これで、ステートメントのRETURNING句とINSERTCTE をUPDATE( SQL Fiddleでも) 使用できるようになりました。

WITH theid AS (
  INSERT INTO tmp_places (name) VALUES ('Moscow') RETURNING id
)
UPDATE tmp_cities tc SET population = 15
  FROM theid
 WHERE tc.id = theid.id;

制約のすべてが継承されるわけではないため、制約にも注意する必要があります。

于 2012-08-09T13:42:35.870 に答える
2

デニス、

継承は、PostgresのINSERTおよびCOPYステートメントでは伝播されません。

于 2012-08-08T15:30:46.947 に答える
1

PostgreSQL では、親テーブルへの外部キーを作成しないでください。これは、このテーブルがテーブルではなくほとんどビューとして機能するためです (実際のデータはそれぞれの子にあるため)。今のところ、トリガーによってのみ解決されます。

この「トリガーの種類」のを見ることができます。

于 2012-08-09T12:06:22.923 に答える