Грешките:
-
RETURNING
липсва клауза във вторияINSERT
изявление. -
Осигурете изричен списък от колони за вашия втори
INSERT
изявление също. -
Не предоставяйте
NULL
вINSERT
изявления ако искате колоната по подразбиране (серийни колони?) да започне. Използвайте ключовата думаDEFAULT
или просто не споменавайте колоната изобщо.
По-доброто решение:
Използвайте моидифициране на данни CTE , наличен от PostgreSQL 9.1, за да направите всичко в един оператор и да спестите режийни разходи и двупосочни пътувания до сървъра. (MySQL не знае нищо подобно, дори обикновени CTE).
Освен това пропуснете UPDATE
чрез повторно моделиране на логиката. Извлечете един идентификатор с nextval()
и се задоволявайте само с два INSERT
изявления.
Ако приемем този модел на данни (трябва да сте посочили това във вашия въпрос):
CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);
Този един query прави всичко:
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
Модел на данни
Може да помислите за промяна на вашия модел на данни към класическа връзка n:m. Ще включва тези таблици и първични ключове:
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
Винаги можете да дефинирате institution_staff.i_id UNIQUE
, ако даден потребител може да принадлежи само към една institution
.