J'ai actuellement une table qui ressemble à ceci:
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;
J'essaie d'exécuter une instruction UPSERT dans PHP en utilisant postgresql, mais j'ai reçu
Erreur fatale: exception PDO non détectée: SQLSTATE [42P10]: référence de colonne non valide: 7 ERREUR: il n'y a pas de contrainte unique ou d'exclusion correspondant à la spécification ON CONFLICT dans C:\Apache24\htdocs\consideration.php: 77 Trace de pile: # 0 C:\Apache24\htdocs\consideration.php (77): PDOStatement-> execute () # 1 {main} jeté dans C:\Apache24\htdocs\consideration.php à la ligne 77
Ma page Web comporte actuellement un formulaire qui prend en compte les réponses des utilisateurs à quatre questions, et ces questions iront dans "PDPC".collection
table. Je veux exécuter INSERT ou UPDATE en fonction du dm_fkey
, qui est la clé étrangère que j'ai définie pour cette table.
Ceci est la déclaration UPSERT que j'ai utilisée.
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
ERREUR: il n'y a pas de contrainte unique ou d'exclusion correspondant à la spécification ON CONFLICT dans
Cela parce que dg_fkey
est une colonne référencée dans un FOREIGN KEY
CONSTRAINT
et pas un index. En fait, si vous souhaitez que cela soit plus rapide, vous pouvez également ajouter un index. Depuis la documentation ON CONFLICT
Vous voulez probablement quelque chose comme ça,
CREATE UNIQUE INDEX asdf ON pdpc.collection(dg_fkey);
Ou ajoutez-le le ddl,
CREATE TABLE pdpc.collection
(
dg_fkey bigint UNIQUE
Ensuite, votre upsert fonctionnera.
N'utilisez jamais de guillemets doubles sur les identifiants, c'est une pratique horrible dans Pg