2012-04-04 14 views
2

Ich möchte einen Benutzer einfügen und erhalten Sie seine ID z. letzte Einfüge-ID durch sql.Postgresql letzte ID Concurrency einfügen

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 

Ist diese Funktion sicher? Ich meine, ist es Nebenläufigkeit sicher? z.B. Werden Benutzer gleichzeitig erstellt, ist garantiert, dass die ID des aktuellen Benutzers zurückgegeben wird?

Antwort

4

Verwendung 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 noch besser, dass die Sequenz explizit verwenden –

+0

Danke. Wirklich einfache Lösung. –

1

Nein, es ist nicht sicher (und es ist schrecklich langsam!)

Sie Sequenzen für diesen Zweck verwendet werden soll.

Wenn die ID-Spalte als seriell definiert ist, wird automatisch eine Sequenz für Sie erstellt, und Sie können die zuletzt generierte Nummer mithilfe von currval('users_id_seq') abrufen.

+0

Es kam mir nie in den Sinn. gute Option –