سؤال

تعديل: عنوان السؤال هذا كان في الأصل: كيف تعرف العقيدة آخر معرف تم إدراجه في 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

نصائح أخرى

last_insert_id يعمل فقط ل AUTO_INCREMENT الأعمدة. لن يعمل إذا قمت بإدخال قيمة يدويًا في AUTO_INCREMENT عمودي.

ستعمل العقيدة لأنها تشبه تخصيص أ NULL لذلك (على الرغم من أنك لا تكتب ذلك أبدًا). هذا يؤدي إلى زيادة السيارات ويوفر قيمة ل last_insert_id().

لقد قمت بتضمين JPG هنا حتى تتمكن من رؤيته. أتمنى أن يساعد!

enter image description here

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