Chyby:
-
RETURNING
ve druhémINSERT
chybí klauzule prohlášení. -
Zadejte explicitní seznam sloupců pro druhý
INSERT
také prohlášení. -
Nezadávejte
NULL
vINSERT
prohlášení pokud chcete, aby se aktivovalo výchozí nastavení sloupce (sériové sloupce?). Použijte klíčové slovoDEFAULT
nebo tento sloupec vůbec nezmiňujte.
Lepší řešení:
Použijte data-moidifying CTE , dostupný od PostgreSQL 9.1, aby to vše udělal v jednom příkazu a ušetřil režii a zpáteční cesty na server. (MySQL nic takového nezná, dokonce ani obyčejné CTE).
Také přeskočte UPDATE
přemodelováním logiky. Získejte jedno ID pomocí nextval()
a vystačíte si s pouhými dvěma INSERT
prohlášení.
Za předpokladu tohoto datového modelu (měli jste jej uvést ve své otázce):
CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);
Tento jeden dotaz dělá vše:
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
Datový model
Můžete uvažovat o změně datového modelu na klasický vztah n:m. Zahrnuje tyto tabulky a primární klíče:
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
Vždy můžete definovat institution_staff.i_id UNIQUE
, pokud uživatel může patřit pouze do jedné institution
.