De fouten:
-
RETURNING
clausule ontbreekt in de tweedeINSERT
verklaring. -
Geef een expliciete lijst met kolommen op voor uw tweede
INSERT
verklaring ook. -
Geef geen
NULL
op in deINSERT
uitspraken als u wilt dat de standaardkolom (seriële kolommen?) in werking treedt. Gebruik het trefwoordDEFAULT
of noem de kolom gewoon helemaal niet.
De betere oplossing:
Gebruik data-moidifying CTE , beschikbaar sinds PostgreSQL 9.1 om het allemaal in één verklaring te doen en overhead en retourvluchten naar de server te besparen. (MySQL weet niets van dien aard, zelfs geen gewone CTE's).
Sla ook de UPDATE
. over door de logica opnieuw te modelleren. Haal één id op met nextval()
, en doe het met slechts twee INSERT
verklaringen.
Uitgaande van dit gegevensmodel (dat had u in uw vraag moeten vermelden):
CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);
Deze een query doet het allemaal:
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
Gegevensmodel
U kunt overwegen uw gegevensmodel te wijzigen in een klassieke n:m-relatie. Zou deze tabellen en primaire sleutels bevatten:
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
U kunt institution_staff.i_id UNIQUE
altijd definiëren , als een gebruiker maar tot één institution
kan behoren .