Kesalahan:
-
RETURNINGklausa tidak ada diINSERTsecond kedua pernyataan. -
Berikan daftar kolom eksplisit untuk
INSERTkedua Anda pernyataan juga. -
Jangan berikan
NULLdiINSERTpernyataan jika Anda ingin kolom default (kolom serial?) digunakan. Gunakan kata kunciDEFAULTatau jangan sebut kolom sama sekali.
Solusi yang lebih baik:
Gunakan CTE pengubah data , tersedia sejak PostgreSQL 9.1 untuk melakukan semuanya dalam satu pernyataan dan menghemat biaya overhead dan perjalanan pulang pergi ke server. (MySQL tidak tahu apa-apa tentang hal itu, bahkan CTE biasa).
Juga, lewati UPDATE dengan memodelkan kembali logika. Ambil satu id dengan nextval()
, dan selesaikan hanya dengan dua INSERT pernyataan.
Dengan asumsi model data ini (Anda seharusnya memberikannya dalam pertanyaan Anda):
CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);
ini kueri melakukan semuanya:
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
Model data
Anda mungkin berpikir untuk mengubah model data Anda ke hubungan n:m klasik.Akan menyertakan tabel dan kunci utama berikut:
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
Anda selalu dapat menentukan institution_staff.i_id UNIQUE , jika pengguna hanya dapat menjadi anggota satu institution .