سؤال

أحصل على هذا الخطأ عند محاولة إضافة مفتاح أجنبي بارع:

#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)

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

CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY  (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;

CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY  (`project_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

الآن، عندما أقوم بتشغيل الاستعلام أدناه لإضافة القيد، فشل الاستعلام مع الخطأ المنشور أعلاه. هل يمكن لأي شخص أن يساعد؟

ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;

مليون شكرا!

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

المحلول

غير ال project_id أعمدة لديها نفس الحجم smallint(6) (أو 5). تحتاج أيضا إلى جعلها موقعة أو غير موقعة.

... من موقع MySQL تقول:

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

نصائح أخرى

اعتقدت أن Datatype اللازم للمطابقة. Project_id هو صغير (6) في طاولة واحدة وقولورنت (5) في الآخر.

لا ينبغي أن يكون كلاهما smallint(6)?

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