2012-04-04 7 views
2

ユーザーを挿入してIDを取得したいとします。最後の挿入ID。 SQLを介して。postgresql最後の挿入IDの同時実行

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

使用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; 
+0

+1明示的にシーケンスを使用してより良い –

+0

ありがとう。本当にシンプルなソリューション。 –

1

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

あなたは、この目的のための配列を使用する必要があります。

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

+0

それは私の心に入ってきたことはありません。良いオプション –

関連する問題