エラー:
-
RETURNING
2番目のINSERT
に句がありません ステートメント。 -
2番目の
INSERT
の列の明示的なリストを提供します 声明も。 -
NULL
を指定しないでくださいINSERT
ステートメント 列のデフォルト(シリアル列?)を開始する場合は、キーワードDEFAULT
を使用します。 または、列についてはまったく触れないでください。
より良い解決策:
data-moidifyingCTE を使用します 、PostgreSQL 9.1以降で利用可能で、すべてを1つのステートメントで実行し、サーバーへのオーバーヘッドとラウンドトリップを節約します。 (MySQLは、単純なCTEでさえも、そのようなことは何も知りません。)
また、UPDATE
をスキップします ロジックを再モデル化することによって。 nextval()
を使用して1つのIDを取得します
、そしてたった2つの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);
この1つ クエリがすべてを実行します:
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
はいつでも定義できます 、ユーザーが1つのinstitution
にのみ所属できる場合 。