Postgresql ve PHP: currval Çok kullanıcılı bir uygulamada, son satır eklenen id almak için verimli bir yoldur?

3 Cevap php

I postgresql tabloya eklenen son satırın id almak için kullandığınız yolu verimli olup olmadığını merak Im ..

Açıkçası, çalışır, ama birçok kullanıcı aynı anda aynı tabloda satırlar ekleyerek olduğunda seri dizisi currval değerine başvuran sorunlu olabilir.

Benim gerçek yoludur:

$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect');

$insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')");
$last_id_query = pg_query("SELECT currval('customer_id_seq')");
$last_id_results = pg_fetch_assoc($last_id_query);
print_r($last_id_results);
pg_close($pgConnection);

Well, its just a test atm. But anyway, i can see 3 issues with this way:

  1. Iki kullanıcı aynı anda aynı şeyi yaparsanız customer_id_seq üzerine başvurulması, onlara bu şekilde gelen aynı kimliği almak ... ya da değil de o olabilirdi?
  2. I have to know tablonun dizisi adı. Pg_get_serial_sequence Dont benim için çalışıyor becose (postgresql im acemi, muhtemelen bir yapılandırma sorunu)

Herhangi bir öneri / daha iyi yollar?

ps: i PDO kullanamaz, işlem kayıt noktası ile biraz eksikliği becose görünüyor; Ben kullanım zend alışkanlık ve, sonunda, (belki sonunda benim sınıfları inşa edeceğiz) php pg_ * işlevleri kullanmayı tercih edeceksiniz

EDIT:

@ Spliff (Thet onun cevabı silindi): Bu daha iyi çalışır ki?

$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect');

pg_query("BEGIN");

$insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')");

$last_id_query = pg_query("SELECT currval('customer_id_seq')");

$last_id_results = pg_fetch_assoc($last_id_query);

print_r($last_id_results);

//do somethings with the new customer id

pg_query("COMMIT");

pg_close($pgConnection);

3 Cevap

PostgreSQL yeni bir sürümünü (> 8.1) kullanırsanız İADE INSERT madde (ve UPDATE) komutu kullanmalısınız.

Eğer manipülasyon işlevlerinden birini kullanmakta ısrar OTOH, fine manual okuyunuz. Bir işaretçi: "Bu bir oturum yerel değerini döndürüyor, çünkü geçerli oturum yaptım çünkü diğer oturumları nextval idam olsun ya da olmasın bir öngörülebilir cevap verir dikkat edin."

Takın ve bir işlem içinde Curval (seq) kontrol edin. Işlem uygulanıyor önce size sorgu ve başka aynı anda takılı hiçbir konuda Curval (seq) görürsünüz.

Tam sözdizimi hatırlamak etmeyin - (son yaklaşık 3 yıl önce pgsql kullanılır), fakat ortak bu gibi görünüyor kılavuzda okuyun:

BEGIN TRANSACTION;
INSERT ...;
SELECT curval(seq);
COMMIT;

ex. log (azalan, User_id) değerleri id dönen (6, 'aklını bırak') içine Minsert