سؤال

أسمع دائمًا أن استخدام "lastInsertId" (أو mysql_insert_id () إذا كنت لا تستخدم PDO) أمر شرير. في حالة المشغلات ، من الواضح أنه ، لأنه يمكن أن يعيد شيئًا ليس تمامًا المعرف الأخير الذي تم إنشاؤه.

$DB->exec("INSERT INTO example (column1) VALUES ('test')");
// Usually returns your newly created ID.
// However when a TRIGGER inserts into another table with auto-increment:
// -> Returns newly created ID of trigger's INSERT
$id = $DB->lastInsertId();

ما هو البديل؟

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

المحلول

إذا ذهبت إلى طريق ADODB (http://adodb.sourceforge.net/) ، ثم يمكنك إنشاء معرف الإدراج قبل اليد وصراحة محددة المعرف عند الإدراج. يمكن تنفيذ ذلك بشكل مقلوب (يدعم ADODB طنًا من قواعد البيانات المختلفة ...) ويضمن أنك تستخدم معرف الإدراج الصحيح.

يتشابه نوع البيانات التسلسلية postgresql باستثناء أنه لكل طاولة/لكل تسابق ، يمكنك تحديد الجدول/التسلسل الذي تريده معرف الإدراج الأخير عند طلبه.

نصائح أخرى

IMHO لا يعتبر إلا "شريرًا" لأنه بالكاد لديه أي قاعدة بيانات SQL أخرى (إن وجدت).

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

أحد البديل هو استخدام التسلسلات بدلاً من ذلك ، لذلك تقوم بإنشاء المعرف بنفسك قبل القيام بالإدراج.

لسوء الحظ ، لا يتم دعمهم في MySQL ، لكن المكتبات مثل ADODB يمكنها محاكاةها باستخدام جدول آخر. ومع ذلك ، أعتقد أن المحاكاة نفسها ستستخدم lastInsertId () أو ما يعادلها ... ولكن على الأقل من غير المرجح أن يكون لديك مشغل على طاولة تستخدم بحتة للتسلسل

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

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

فمثلا:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';

يمكنك تجربة هذا:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top