FROMステートメントで複数のソースを使用しようとすると、Postgres 9.5のON CONFLICT DO UPDATE
に問題があります。制限値が重複しているUpsertエラー(On Conflict Do Update)
INSERT INTO new.bookmonographs (citavi_id, abstract, createdon, edition, title, year)
SELECT "ID", "Abstract", "CreatedOn"::timestamp, "Edition", "Title", "Year"
FROM old."Reference"
WHERE old."Reference"."ReferenceType" = 'Book'
AND old."Reference"."Year" IS NOT NULL
AND old."Reference"."Title" IS NOT NULL
ON CONFLICT (citavi_id) DO UPDATE
SET (abstract, createdon, edition, title, year) = (excluded.abstract, excluded.createdon, excluded.edition, excluded.title, excluded.year)
;
不良コード:作業コードの
例
INSERT INTO new.bookmonographs (citavi_id, abstract, createdon, edition, title, year)
SELECT "ID", "Abstract", "CreatedOn"::timestamp, "Edition", "Title", "Year"
FROM old."Reference", old."ReferenceAuthor"
WHERE old."Reference"."ReferenceType" = 'Book'
AND old."Reference"."Year" IS NOT NULL
AND old."Reference"."Title" IS NOT NULL
AND old."ReferenceAuthor"."ReferenceID" = old."Reference"."ID"
--Year, Title and Author must be present in the data, otherwise the entry is deemed useless, hence won't be included
ON CONFLICT (citavi_id) DO UPDATE
SET (abstract, createdon, edition, title, year) = (excluded.abstract, excluded.createdon, excluded.edition, excluded.title, excluded.year)
;
私は、文とその確かエントリのみを作るための1つの以上のステートメントから追加のソースを追加しましたタイトル、年、著者が新しいデータベースに挿入されます。 (古い場合は "Reference"。 "ID"は "ReferenceAuthor"として "ReferenceID"として存在し、その後は作成者が存在します。)追加のWHERE文がなくても、クエリに誤りがあります。 SELECTで指定した列はold."Reference"
にのみ存在し、old."ReferenceAuthor"
には存在しません。
ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values. ********** Error **********
ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time SQL state: 21000 Hint: Ensure that no rows proposed for insertion within the same command have duplicate constrained values.
私が間違っているかわからない、またはなぜ:
CONSTRAINT bookmonographs_pk PRIMARY KEY (bookmonographsid),
CONSTRAINT bookmonographs_bookseries FOREIGN KEY (bookseriesid)
REFERENCES new.bookseries (bookseriesid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT bookmonographs_citaviid_unique UNIQUE (citavi_id)
エラーPSQLはスロー: 現在old."ReferenceAuthor"
とold."Reference"
がUNIQUE制約を持っていない、bookmonographsためuniqe制約がありますヒントは、重複した制約値を指します。
注:*通常のケース*更新では、 "ターゲットごとの複数の更新"は無視されます(最終的な結果はソースタプルのランダムな順序に依存します)。 ON CONFLICTの場合、ターゲットタプルごとに複数のソースタプルが再帰的/カスケードのコンフリクトを引き起こすか、またはランダムな順序の問題が発生するか、または失敗します(OQの場合と同様)。 – joop
魅力的な作品です、ありがとうございました。エラーの原因を特定するためのあなたの思考プロセスは何でしたか?それともこの種の問題を経験したことでしょうか? – Telefonmann
@Telefonmann私はすでにこの制限を認識していましたが、エラーメッセージもかなり明確でした。 – redneb