كيف يعرف PDO آخر معرف تم إدراجه في MySQL؟
-
28-09-2019 - |
سؤال
تعديل: عنوان السؤال هذا كان في الأصل: كيف تعرف العقيدة آخر معرف تم إدراجه في MySQL؟ وكان مرتبطا عقيدة orm mapper. بعد بعض الحفر اكتشفت أن هذا السؤال لا يرتبط عقيدة لكن من أجل PDO_MYSQL, MySQL C API وأخيراً - إلى اتصال عميل خادم العميل MySQL. لقد قررت تغيير العنوان ، لذلك ربما يجد شخص ما إجابة على سؤاله.
بالنسبة لأولئك الذين لا يستخدمون العقيدة: كنت فضوليًا ، لماذا يرفرف:
mysql_query("INSERT INTO category (name) VALUES('cat')");
echo mysql_insert_id();
أو مشابه:
$pdo->exec("INSERT INTO category (name) VALUES('cat')");
echo $pdo->lastInsertId();
سيؤدي إلى منصب واحد فقط (بدون منفصل SELECT LAST_INSERT_ID()
) في السجل:
1701 Query INSERT INTO category (name) VALUES ('cat')
السؤال الأصلي:
لدي طاولتان:
category(id,name)
product(id, name, categoryId)
لقد قمت بإنشاء كائن فئة جديد وكائن المنتج. لقد قمت بتعيين كائن الفئة لكائن المنتج. لم أقم بتعيين أي معرفات:
$product = new Product();
$product->name = 'asdf';
$category = new Category();
$category->name = 'cat';
$product->Category = $category;
بعد ذلك قمت بتنظيف الاتصال وتحقق من سجلات MySQL:
1684 Query START TRANSACTION
1684 Query INSERT INTO category (name) VALUES ('cat')
1684 Query INSERT INTO product (name, categoryid) VALUES ('asdf', '312')
1684 Query COMMIT
كيف عرفت العقيدة ، أن معرف الفئة الذي تم إنشاؤه حديثًا هو 312؟ لا يوجد شيء آخر في السجلات.
المحلول
قمت ببعض الأبحاث وتصفح بعض التعليمات البرمجية المصدر ، لذلك قد تكون إجابتي خاطئة بعض الشيء وليست دقيقة.
بادئ ذي بدء ، هذا لا يرتبط حقًا بـ عقيدة. عقيدة الاستخدامات PDO_MYSQL. لكن داخليا PDO_MYSQL يستخدم نفس الشيء مثل mysql_insert_id
وظيفة - أصلي MySQL C API وظيفة - mysql_insert_id
.
سبب عدم وجود فصل SELECT LAST_INSERT_ID()
يكمن في الحقيقة ، بعد تنفيذ البيان (في المثال الخاص بي INSERT
) ، يستجيب الخادم بالبيانات وبعض الأشياء الأخرى المدرجة في موافق الحزمة)، بما فيها insert_id
. لذلك عندما نطلق النار mysql_insert_id()
نحن لا نتواصل مع الخادم ، لتلقي insert_id
- لا تحتاج مكتبة MySQL إلى القيام بذلك - لديها بالفعل هذه القيمة المخزنة من آخر تنفيذ للاستعلام (على الأقل أعتقد ذلك بعد تحليل الملف libmysql.c
)
موافق الحزمة موصوف هنا: MySQL Generic Response Packets - OK Packet
نصائح أخرى
ربما عن طريق الاتصال http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
last_insert_id
يعمل فقط ل AUTO_INCREMENT
الأعمدة. لن يعمل إذا قمت بإدخال قيمة يدويًا في AUTO_INCREMENT
عمودي.
ستعمل العقيدة لأنها تشبه تخصيص أ NULL
لذلك (على الرغم من أنك لا تكتب ذلك أبدًا). هذا يؤدي إلى زيادة السيارات ويوفر قيمة ل last_insert_id()
.
لقد قمت بتضمين JPG هنا حتى تتمكن من رؤيته. أتمنى أن يساعد!