ما الذي يمكن أن يسبب معرفات مكررة في حقل المفتاح الأساسي للزيادة التلقائية (mysql)؟

StackOverflow https://stackoverflow.com/questions/514018

  •  21-08-2019
  •  | 
  •  

سؤال

تم الحل

من المطور:كانت المشكلة أن الإصدار السابق من الكود كان لا يزال يكتب إلى الجدول الذي يستخدم المعرفات اليدوية بدلاً من الزيادة التلقائية.ملاحظة في تقرير المصير:تحقق دائمًا من المواقع المحتملة الأخرى التي تم كتابة الجدول إليها.

نحصل على مفاتيح مكررة في الجدول.ولا يتم إدخالهما في نفس الوقت (بفارق 6 ساعات).

هيكل الجدول:

CREATE TABLE `table_1` (
  `sales_id` int(10) unsigned NOT NULL auto_increment,
  `sales_revisions_id` int(10) unsigned NOT NULL default '0',
  `sales_name` varchar(50) default NULL,
  `recycle_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`sales_id`),
  KEY `sales_revisions_id` (`sales_revisions_id`),
  KEY `sales_id` (`sales_id`),
  KEY `recycle_id` (`recycle_id`)
) ENGINE= MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26759 ;

الإدراج:

insert into `table_1` ( `sales_name` ) VALUES ( "Blah Blah" )

نحن نقوم بتشغيل MySQL 5.0.20 مع PHP5 ونستخدم mysql_insert_id() لاسترداد معرف الإدراج مباشرة بعد استعلام الإدراج.

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

المحلول

لقد ظهرت لي بعض أخطاء المفاتيح المكررة فجأة في قواعد بيانات MySql في الماضي على الرغم من تحديد المفتاح الأساسي وزيادة تلقائية.في كل مرة كان ذلك بسبب تلف الجدول.

إذا كان تالفًا، فيجب أن يؤدي إجراء فحص الجداول إلى كشف المشكلة.يمكنك القيام بذلك عن طريق تشغيل:

CHECK TABLE tbl_name

إذا عاد مرة أخرى باعتباره تالفًا بأي حال من الأحوال (سيقول عادةً أن الحجم أكبر مما ينبغي أن يكون عليه في الواقع)، فما عليك سوى تشغيل ما يلي لإصلاحه:

REPAIR TABLE tbl_name

نصائح أخرى

هل يحتوي حقل sales_id على مفتاح أساسي (أو فريد)؟إذا لم يكن الأمر كذلك، فمن المحتمل أن يكون هناك شيء آخر يقوم بإدخالات أو تحديثات تعيد استخدام الأرقام الموجودة.وبكلمة "شيء آخر" لا أقصد فقط الكود؛من الممكن أن يكون إنسانًا لديه حق الوصول إلى قاعدة البيانات يفعل ذلك عن طريق الخطأ.

وكما قال الآخر؛مع المثال الخاص بك فإنه ليس من الممكن.

لا علاقة له بسؤالك، ولكن ليس عليك إنشاء مفتاح منفصل لعمود المفتاح الأساسي - فهو مجرد إضافة فهرس إضافي غير فريد إلى الجدول عندما يكون لديك بالفعل المفتاح الفريد (الأساسي).

نحصل على مفاتيح مكررة في الجدول.

هل تعني أنك تحصل على أخطاء أثناء محاولتك الإدراج، أو هل تعني أن لديك بعض القيم مخزنة في العمود أكثر من مرة؟

يتم تشغيل الزيادة التلقائية فقط عند حذف العمود من INSERT، أو محاولة إدراج NULL أو صفر.بخلاف ذلك، يمكنك تحديد قيمة في عبارة INSERT، مما يؤدي إلى تجاوز آلية الزيادة التلقائية.على سبيل المثال:

INSERT INTO table_1 (sales_id) VALUES (26759);

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

الرجاء نشر نتائج هذا الاستعلام:

SELECT `sales_id`, COUNT(*) AS `num`
FROM `table_1`
GROUP BY `sales_id`
HAVING `num` > 1
ORDER BY `num` DESC
  • إذا كان لديك مفتاح فريد في حقول أخرى، فقد تكون هذه هي المشكلة.

  • إذا وصلت إلى أعلى قيمة لعمود الزيادة التلقائية، فسوف يستمر MySQL في محاولة إعادة إدراجه.على سبيل المثال، إذا كان sales_id عمودًا صغيرًا جدًا، فستحصل على أخطاء مفاتيح مكررة بعد الوصول إلى المعرف 127.

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