Fejlene:
-
RETURNERER
klausul mangler i den andenINSERT
erklæring. -
Angiv en eksplicit liste over kolonner til din anden
INSERT
erklæring også. -
Angiv ikke
NULL
iINSERT
udsagn hvis du ønsker, at kolonnens standard (serielle kolonner?) skal slå ind. Brug nøgleordetDEFAULT
eller bare slet ikke nævne kolonnen.
Den bedre løsning:
Brug data-moidifying CTE , tilgængelig siden PostgreSQL 9.1 til at gøre det hele i én erklæring og gemme en overhead og rundrejser til serveren. (MySQL kender intet til den slags, ikke engang almindelige CTE'er).
Spring også nextval()
, og nøjes med kun to INSERT
udsagn.
Forudsat denne datamodel (det skulle du have angivet i dit spørgsmål):
CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);
Denne en forespørgsel gør det hele:
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
Datamodel
Du overvejer måske at ændre din datamodel til et klassisk n:m-forhold. Vil inkludere disse tabeller og primærnøgler:
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
Du kan altid definere institution_staff.i_id UNIQUE
, hvis en bruger kun kan tilhøre én institution
.