De fouten:
-
RETURNINGclausule ontbreekt in de tweedeINSERTverklaring. -
Geef een expliciete lijst met kolommen op voor uw tweede
INSERTverklaring ook. -
Geef geen
NULLop in deINSERTuitspraken als u wilt dat de standaardkolom (seriële kolommen?) in werking treedt. Gebruik het trefwoordDEFAULTof 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 .