سؤال

هل هناك بديل ل mysql_insert_id() وظيفة php لـ PostgreSQL؟تعمل معظم الأطر على حل المشكلة جزئيًا من خلال إيجاد القيمة الحالية للتسلسل المستخدم في المعرف.ومع ذلك، في بعض الأحيان يكون المفتاح الأساسي ليس عمودًا تسلسليًا....

هل كانت مفيدة؟

المحلول

من وجهة نظر PostgreSQL، في الكود الزائف:

 * $insert_id = INSERT...RETURNING foo_id;-- only works for PostgreSQL >= 8.2. 

 * INSERT...; $insert_id = SELECT lastval(); -- works for PostgreSQL >= 8.1

 * $insert_id = SELECT nextval('foo_seq'); INSERT INTO table (foo...) values ($insert_id...) for older PostgreSQL (and newer PostgreSQL)

pg_last_oid() يعمل فقط عندما يكون لديك معرفات الكائنات (OIDs).لقد تم إيقاف معرفات الكائنات افتراضيًا منذ PostgreSQL 8.1.

لذا، اعتمادًا على إصدار PostgreSQL لديك، يجب عليك اختيار إحدى الطرق المذكورة أعلاه.من الناحية المثالية، بالطبع، استخدم مكتبة تجريد قاعدة البيانات التي تلخص ما سبق.بخلاف ذلك، في التعليمات البرمجية ذات المستوى المنخفض، يبدو الأمر كما يلي:

الطريقة الأولى:إدراج...عودة

// 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];

الطريقة الثالثة:nextval();إدراج

$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);");

الرهان الأكثر أمانًا هو الطريقة الثالثة، لكنها غير عملية.الأنظف هو الأول، لكنك ستحتاج إلى تشغيل PostgreSQL حديث.معظم مكتبات تجريد قاعدة البيانات لا تستخدم الطريقة الأولى بعد.

نصائح أخرى

تفحص ال عودة شرط اختياري للحصول على بيان INSERT.(رابط إلى وثائق PostgreSQL الرسمية)

لكن في الأساس، عليك القيام بما يلي:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

وتقوم عبارة INSERT نفسها بإرجاع المعرف (أو أي تعبير تحدده) للصف المتأثر.

من php.net:

$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')");

يجب أن يوفر هذا دائمًا مفتاحًا فريدًا، لأن المفتاح الذي تم استرداده من قاعدة البيانات لن يتم استرداده مرة أخرى أبدًا.

يمكنك أيضًا استخدام:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');

يجب عليك أن تحدد في pg_fetch_result رقم الصف واسم الحقل الذي تبحث عنه، وهذه طريقة أكثر دقة للحصول على البيانات التي تحتاجها، لكنني لا أعرف ما إذا كان هذا له بعض العقوبات في أداء الاستعلام.تذكر أن هذه الطريقة مخصصة لإصدارات PostgreSQL 8.2 وما فوق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top