2

ユーザーを挿入してそのIDを取得したい(例:最後の挿入ID)。SQLを介して。

CREATE OR REPLACE FUNCTION create_user(registration_ip inet)
  RETURNS integer AS
insert into users(registration_ip)
   values($1);
select max(id) from users;
LANGUAGE sql VOLATILE

この機能は安全ですか?つまり、並行性は安全ですか?たとえば、n人のユーザーが同時に作成されている場合、現在のユーザーのIDが返されることが保証されていますか?

4

2 に答える 2

4

RETURNINGを使用:

CREATE OR REPLACE FUNCTION create_user(registration_ip inet)
  RETURNS integer AS
INSERT INTO users(registration_ip)
   VALUES($1) RETURNING id;
LANGUAGE sql VOLATILE;
于 2012-04-04T08:06:19.257 に答える
1

いいえ、それ安全ではありません(そしてそれはひどく遅いです!)

この目的にはシーケンスを使用する必要があります。

id列がシリアルとして定義されている場合、シーケンスが自動的に作成され、を使用して最後に生成された番号を取得できますcurrval('users_id_seq')

于 2012-04-04T08:03:44.340 に答える