Postgresql 10 Nu există o constrângere unică sau de excludere care să corespundă specificației ON CONFLICT (Administrarea bazelor de date, Postgresql, Actualizare, Cheie Străină, Insert)

Ray a intrebat.

În prezent, am un tabel care arată astfel:

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;

Încerc să execut o instrucțiune UPSERT în PHP folosind postgresql, dar am primit

Eroare fatală: Uncaught PDOException: SQLSTATE[42P10]: Referință de coloană invalidă: 7 ERROR: nu există o constrângere unică sau de excludere care să corespundă specificației ON CONFLICT în C:Apache24htdocsconsideration.php:77 Stack trace: #0 C:Apache24htdocsconsideration.php(77): PDOStatement->execute() #1 {main} thrown in C:Apache24htdocsconsideration.php on line 77

Pagina mea web are în prezent un formular care primește un utilizator care introduce răspunsuri la patru întrebări, iar aceste întrebări vor intra în "PDPC".collection tabel. Doresc să execut INSERT sau UPDATE în funcție de dm_fkey, , care este cheia externă pe care am setat-o pentru acest tabel.

Aceasta este instrucțiunea UPSERT pe care am folosit-o.

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

Comentarii

  • Vă rugăm să vă înregistrați/unirea conturilor și veți putea edita întrebarea și accepta un răspuns. –  > Por ypercubeᵀᴹ.
  • Conflictele apar din cauza constrângerilor unice sau de excludere, nu din constrângerile FOREIGN KEY. Este dg_fkey ar trebui să fie unică? –  > Por ypercubeᵀᴹᴹ.
1 răspunsuri
Evan Carroll

ERROR: nu există nicio constrângere unică sau de excludere care să corespundă specificației ON CONFLICT în

Acest lucru se datorează faptului că dg_fkey este o coloană la care se face referire într-o FOREIGN KEY CONSTRAINT și nu un index. De fapt, dacă doriți ca acest lucru să fie mai rapid, puteți lua în considerare adăugarea suplimentară a unui index. Din documentația privind ON CONFLICT

Probabil că doriți ceva de genul acesta,

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

Sau adăugați-l în ddl,

CREATE TABLE pdpc.collection
(
    dg_fkey bigint UNIQUE

Apoi, upsert-ul va funcționa.


De asemenea, nu folosiți niciodată ghilimele duble la identificatori, aceasta este o practică oribilă în Pg

Comentarii

  • Acest lucru NU se datorează faptului că este „nu este un index.” –  > Por ypercubeᵀᴹ.
  • Exact cum spune @ypercubeᵀᴹ, nu are nimic de-a face cu un index. Eroarea constă în faptul că condiția ON CONFLICT trebuie să fie unică, adică să fie un PK sau un set de coloane care poate identifica în mod unic un rând –  > Por harogaston.