現在、次のようなテーブルがあります。
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
エラー:のON CONFLICT指定に一致する一意の制約または除外制約がありません
これは、dg_fkey
がFOREIGN KEY
CONSTRAINT
で参照される列であり、インデックスではないためです。実際、それをより高速にしたい場合は、インデックスを追加することを検討してください。 ON CONFLICT
のドキュメントから
あなたはおそらくこのようなものを望みます、
CREATE UNIQUE INDEX asdf ON pdpc.collection(dg_fkey);
または、ddlを追加します。
CREATE TABLE pdpc.collection
(
dg_fkey bigint UNIQUE
その後、アップサートが機能します。
また、識別子に二重引用符を使用しないでください。これは、Pgでの恐ろしい慣行です。