web-dev-qa-db-ja.com

Postgresql 10 ON CONFLICT仕様に一致する一意の制約または除外制約はありません

現在、次のようなテーブルがあります。

CREATE TABLE "PDPC".collection
(
    col_no bigint NOT NULL DEFAULT nextval('"PDPC".collection_col_no_seq'::regclass),
    q1 character varying(10000) COLLATE pg_catalog."default",
    q2 character varying(10000) COLLATE pg_catalog."default",
    q3 character varying(10000) COLLATE pg_catalog."default",
    q4 character varying(10000) COLLATE pg_catalog."default",
    dg_fkey bigint,
    CONSTRAINT collection_pkey PRIMARY KEY (col_no),
    CONSTRAINT collection_dg_fkey_fkey FOREIGN KEY (dg_fkey)
        REFERENCES "PDPC".datagroup (dg_no) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE "PDPC".collection
    OWNER to postgres;

PHP postgresqlを使用してUPSERTステートメントを実行しようとしていますが、

致命的なエラー:キャッチされていないPDOException:SQLSTATE [42P10]:無効な列参照:7エラー:C:\ Apache24\htdocs\consideration.php:77のON CONFLICT指定に一致する一意または除外の制約がありませんスタックトレース:#0 C:\Apache24\htdocs\consideration.php(77):PDOStatement-> execute()#1 {main}がC:\ Apache24\htdocs\consideration.phpの77行目にスローされました

私のWebページには現在、4つの質問に対する回答のユーザー入力を取り込むフォームがあり、これらの質問は"PDPC".collectionテーブルに入ります。このテーブルに設定した外部キ​​ーであるdm_fkeyに従ってINSERTまたはUPDATEを実行したい。

これは私が使用したUPSERTステートメントです。

INSERT INTO "PDPC".collection (q1, q2, q3, q4, dg_fkey)
      VALUES (:q1, :q2, :q3, :q4, :dg_no)
      ON CONFLICT(dg_fkey) DO UPDATE 
      SET q1=:q1, q2=:q2, q3=:q3, q4=:q4
3
Ray

エラー:のON CONFLICT指定に一致する一意の制約または除外制約がありません

これは、dg_fkeyFOREIGN KEYCONSTRAINTで参照される列であり、インデックスではないためです。実際、それをより高速にしたい場合は、インデックスを追加することを検討してください。 ON CONFLICT のドキュメントから

あなたはおそらくこのようなものを望みます、

CREATE UNIQUE INDEX asdf ON pdpc.collection(dg_fkey);

または、ddlを追加します。

CREATE TABLE pdpc.collection
(
    dg_fkey bigint UNIQUE

その後、アップサートが機能します。


また、識別子に二重引用符を使用しないでください。これは、Pgでの恐ろしい慣行です。

2
Evan Carroll