PostgreSQL için mysql_insert_id () php işlevi için bir alternatif var mı? Çerçeveler çoğu ID kullanılan dizisinin geçerli değeri bularak kısmen sorunu çözme. Ancak, birincil anahtar bir seri kolon olmadığı zamanlar vardır ....
Pseudo-kod bakış PostgreSQL noktadan itibaren:
$ Insert_id = INSERT ... İADE foo_id; - sadece PostgreSQL> = 8.2 için çalışıyor.
INSERT ...; $ Insert_id = lastval () SELECT; - PostgreSQL> = 8.1 için çalışıyor
$ Insert_id = nextval ('foo_seq') SELECT; INSERT INTO tablo (foo. ..) eski PostgreSQL için değerleri ($ insert_id ...) (ve daha yeni PostgreSQL)
pg_last_oid () OID'leri var burada çalışır. OID'ler PostgreSQL 8.1 beri varsayılan olarak kapalı olmuştur.
Yani, hangi PostgreSQL sürümü bağlı olarak, yukarıdaki yöntemle birini seçmelisin. İdeal olarak, elbette, yukarıda uzakta soyutlayan bir veritabanı soyutlama kitaplığı kullanın. Aksi takdirde, düşük seviye kod, bu gibi görünüyor:
// yes, we're not using pg_insert()
$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_row($result);
$insert_id = $insert_row[0];
$result = pg_execute($db, "INSERT INTO foo (bar) values (123);");
$insert_query = pg_query("SELECT lastval();");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];
$insert_query = pg_query($db, "SELECT nextval('foo_seq');");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];
$result = pg_execute($db, "INSERT INTO foo (foo_id, bar) VALUES ($insert_id, 123);");
Güvenli bahis üçüncü yöntem olacaktır, ama hantal değil. Temiz ilk, ancak yeni bir PostgreSQL çalıştırmak gerekiyordu. En db soyutlama kütüphaneler olsa da henüz ilk yöntemini kullanmayın.
INSERT deyimi için RETURNING optional clause göz atın. (Resmi PostgreSQL belgelerine Link)
Ama temelde, bunu:
INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col
ve INSERT deyimi kendisi etkilenen satır id (veya ne olursa olsun ifade belirttiğiniz) döndürür.
Php.net Gönderen:
$res=pg_query("SELECT nextval('foo_key_seq') as key");
$row=pg_fetch_array($res, 0);
$key=$row['key'];
// now we have the serial value in $key, let's do the insert
pg_query("INSERT INTO foo (key, foo) VALUES ($key, 'blah blah')");
Veritabanından alınan tuşuna tekrar geri asla olacaktır, çünkü bu her zaman, benzersiz anahtarını sağlamanız gerekir.
Da kullanabilirsiniz:
$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');
Siz pg_fetch_result içinde satır ve aradığınız alan adı sayısını belirtmek zorunda, bu size ihtiyacınız verileri almak için daha doğru bir yol olduğunu, ancak bu bazı cezası varsa ben bilmiyorum sorgu performansı. Bu yöntem, PostgreSQL sürümleri 8.2 ve üstü için olduğunu unutmayın.
(... Onlar cevap notunu ekleyerek yaklaşık diyordun ama ... Onu bulmak için tartışmaya sistemini kötüye için üzgün görünmüyor)
@ Vertigo eee ... birincil anahtar bir seri kolon ise uç değer temelde de çözüldü almak için bir çözüm. Ancak, ben bir seri PK olmayan bir tabloya bir ekleme deyimi veren sonra insert kimliği almak gerekir bu sorunu yaşıyorum ...
Ben (daha sonra başka bir yanıt yol açacak gibi) bunu düzenlemek için bir iyi bir fikir olup olmadığından emin çok soruma özel ve değil idi. Eğer daha fazla bilgiye ihtiyacınız varsa Ama bilmek istediğiniz durumda, i Kohana Forumda http://forum.kohanaphp.com/comments.php?DiscussionID=1145 başlayan bir tartışma var