PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Errore logico della funzione INSERT PHP/MySQL

Gli errori:

  • RETURNING manca la clausola nel secondo INSERT dichiarazione.

  • Fornisci un elenco esplicito di colonne per il tuo secondo INSERT dichiarazione, anche.

  • Non fornire NULL nel INSERT dichiarazioni se vuoi che si attivi l'impostazione predefinita della colonna (colonne seriali?). Usa la parola chiave DEFAULT o semplicemente non menzionare affatto la colonna.

La soluzione migliore:

Usa CTE modifica i dati , disponibile da PostgreSQL 9.1 per fare tutto in un'unica istruzione e risparmiare un sovraccarico e viaggi di andata e ritorno al server. (MySQL non sa nulla del genere, nemmeno semplici CTE).

Inoltre, salta l'UPDATE rimodellando la logica. Recupera un ID con nextval() , e accontentati di due soli INSERT dichiarazioni.

Assumendo questo modello di dati (avresti dovuto fornirlo nella tua domanda):

CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);

Questo uno query fa tutto:

WITH x AS (
    INSERT INTO staff(username, password, i_id) -- provide column list
    VALUES ('$username', '$password', nextval('institutions_i_id_seq'))
    RETURNING user_id, i_id
    )
INSERT INTO institutions (i_id, u_id, name)
SELECT x.i_id, x.user_id, '$institution'
FROM   x
RETURNING u_id, i_id; -- if you need the values back, else you are done

Modello di dati

Potresti pensare di cambiare il tuo modello di dati in una classica relazione n:m. Includere queste tabelle e chiavi primarie:

staff (u_id serial PRIMARY KEY, ...)
institution (i_id serial PRIMARY KEY, ...)
institution_staff (i_id, u_id, ...,  PRIMARY KEY(i_id, u_id)) -- implements n:m

Puoi sempre definire institution_staff.i_id UNIQUE , se un utente può appartenere solo a un institution .