Postgres / PHP - eklenen bir satırın kimliğini almak için standart bir yol nedir?

3 Cevap php

Google'da aradı ve farklı insanlar bu sorunu nasıl yaklaşacağını makalelerin bir çift okudum, ama ben bir için en iyi çalışacak, aynı zamanda onu çözme standard yolu nedir merak edildi ve var benim durum.

Ben yeni bir soru oluşturan bir AJAX sayfası var ve ben bir sonraki satırda, aynı php dosyası içinde insert sorgudan kimliğini almak için bilmek gerekir.

Bunun gibi bir şey görünüyor:

$r = pg_query("INSERT INTO questions (audit_id, type_id, order) VALUES (1,1,1)");
// Fetch ID from $r here...

MySQL için mysql_insert_id() işlevini görmüş ve pg_last_oid() PostgreSQL için benzer, ancak documentation bu önerilmiyor ve yakında silinecektir iddia duydum. Ben de CURRVAL('my_sequence_table.id') kullanımını gördük ama bu bir yarış durumu yükseltmek olabilir çünkü bu AJAX ile çalışacaktır eğer emin değilim.

Biri bu sorunu çözmek için standard PHP / PostgreSQL yolu bana söyleyebilir misiniz? Ben büyük yorumlarınızı takdir ediyorum.

P.S. Ruby on Rails kaçırmayın!

3 Cevap

MySQL değiştirmemesi alanları kavramı vardır, PostgreSQL sequences kavramı vardır. Bir Postgres dizisi olan değeri artabilir adlı bir veritabanı nesnesidir. Bunu görmek Lütfen FAQ.

Muhtemelen en iyi bahis o el veya bir dizi aracılığıyla değer fiş olup olmadığını size doğru değeri verecektir olarak, INSERT INTO questions ... VALUES (1,1,1) RETURNING audit_id kullanmaktır.

currval() hile kesinlikle işe gerektiğini Not aynı oturumu alırsanız - currval() aynı değeri döndürmek için garanti olduğunu, ne olursa olsun, diğer eşzamanlı oturumlar arasında, sizin oturumunda teslim dizisi yapıyoruz. Eğer bir şekilde ikinci sorgu daha ilk sorgu için farklı bir bağlantı kullanan bir connection pooler var, ama o yaptım eğer oldukça Pooler kırılmış olur eğer sadece bir sorun neden olabilir. Ben şeyleri bu şekilde yaptığı hiçbir pooler biliyorum.

Update: Bir tablo ve sütun adını alır ve ilişkili dizi adını döndürür pg_get_serial_sequence () işlevi, Bkz. Bu kod dizisi adını hardcoding daha kullanmak daha pratiktir.

Ben CURRVAL('my_sequence_table.id') seçeneğini kullanarak öneriyoruz.

O for the current session son değeri dönecektir ve bu aynı seansta iki ardışık ifadeler olacak gibi sizin için bir yarış durumu neden olmamalıdır.