web-dev-qa-db-fra.com

Postgresql 10 Il n'y a pas de contrainte unique ou d'exclusion correspondant à la spécification ON CONFLICT

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
3
Ray

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 KEYCONSTRAINT 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

2
Evan Carroll