خطأ Mysql 1452-لا يمكن إضافة أو تحديث صف تابع: فشل قيد مفتاح خارجي




foreign-keys mysql-error-1452 (13)

اقتطاع الجداول ثم حاول إضافة FK قيد .

أعرف أن هذا الحل غريب بعض الشيء ولكنه يعمل بنسبة 100٪. لكنني أوافق على أن هذا ليس حلا مثاليا للتعامل مع المشكلة ، ولكن آمل أن يساعد ذلك.

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

فيما يلي صورة لعلاقات الجدول الخاصة بي ، التي تم إنشاؤها عبر phpMyAdmin: Relationships

لقد قمت بعمل استعلام SHOW CREATE TABLE على كلا الجدولين ، sourcecodes_tags هو الجدول ذو المفتاح الخارجي ، sourcecodes هو الجدول المشار اليه.

CREATE TABLE `sourcecodes` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `language_id` int(11) unsigned NOT NULL,
 `category_id` int(11) unsigned NOT NULL,
 `title` varchar(40) CHARACTER SET utf8 NOT NULL,
 `description` text CHARACTER SET utf8 NOT NULL,
 `views` int(11) unsigned NOT NULL,
 `downloads` int(11) unsigned NOT NULL,
 `time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`),
 KEY `language_id` (`language_id`),
 KEY `category_id` (`category_id`),
 CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `sourcecodes_tags` (
 `sourcecode_id` int(11) unsigned NOT NULL,
 `tag_id` int(11) unsigned NOT NULL,
 KEY `sourcecode_id` (`sourcecode_id`),
 KEY `tag_id` (`tag_id`),
 CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

سيكون أمرا رائعا إذا كان أي شخص يمكن أن يقول لي ما يجري هنا ، لم يكن لدي أي تدريب رسمي أو أي شيء مع MySQL :)

شكر.

تحرير: هذا هو الرمز الذي يقوم بإنشاء الخطأ:

ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE

إفراغ بيانات كل من الجداول الخاصة بك وتشغيل الأمر. سوف تعمل.


بالنسبة لي ، كانت هذه المشكلة مختلفة قليلاً وسهلة الفهم والتحقق منها.

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

SHOW TABLE STATUS WHERE Name =  't1';

ALTER TABLE t1 ENGINE=InnoDB;

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

لذلك إذا تم تعيين العمود المعين لمعرف صف في جدول آخر ، فتأكد من وجود صف موجود في الجدول وإلا سيظهر هذا الخطأ.


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


كان لدي نفس المشكلة بالضبط حول ثلاث مرات مختلفة. في كل حالة كان ذلك بسبب واحد (أو أكثر) من سجلاتي لم تتوافق مع المفتاح الخارجي الجديد. قد ترغب في تحديث السجلات الموجودة لديك لمتابعة قيود بناء الجملة للمفتاح الخارجي قبل محاولة إضافة المفتاح نفسه. يجب على المثال التالي عزل سجلات المشكلة بشكل عام:

SELECT * FROM (tablename)
    WHERE (candidate key) <> (proposed foreign key value) 
        AND (candidate key) <> (next proposed foreign key value)

كرر AND (candidate key) <> (next proposed foreign key value) ضمن الاستعلام الخاص بك لكل قيمة في المفتاح الخارجي.

إذا كان لديك الكثير من السجلات ، فقد يكون ذلك صعباً ، ولكن إذا كان طاولتك صغيرة بشكل معقول ، فلا يجب أن تستغرق وقتاً طويلاً. أنا لست مذهلًا جدًا في بناء جملة SQL ، ولكن هذا دائمًا ما عزل المشكلة بالنسبة لي.


كان لي نفس المشكلة مع قاعدة بيانات mysql بلدي ولكن في النهاية حصلت على الحل الذي عمل بالنسبة لي.
حيث أن كل شيء في الجدول الخاص بي على ما يرام من وجهة نظر الخلية (كل من الجدول يجب استخدام محرك Innodb ويجب أن يكون نوع البيانات من كل عمود من نفس النوع الذي يشارك في القيد الأجنبي المفتاح).
الشيء الوحيد الذي فعلته هو تعطيل التحقق من المفتاح الخارجي وبعد ذلك تم تمكينه بعد إجراء عملية المفتاح الخارجي.
الخطوات التي اتخذتها:

mysql> SET foreign_key_checks = 0;

mysql> alter table tblUsedDestination add constraint f_operatorId foreign key(iOperatorId) references tblOperators (iOperatorId); Query
OK, 8 rows affected (0.23 sec) Records: 8  Duplicates: 0  Warnings: 0

mysql> SET foreign_key_checks = 1;

كان لي نفس المشكلة والحل وجدت ، ووضع NULL بدلا من NOT NULL في العمود المفتاح الخارجي. هنا استعلام:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

قام MySQL بتنفيذ هذا الاستعلام!


كنت على استعداد لهذه الحلول وهذا المثال قد يساعد.

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

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

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

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

أتمنى أن يساعدك هذا.


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


من المحتمل جدًا أن يحتوي جدول sourcecodes_tags على قيم sourcecode_id التي لم تعد موجودة في جدول sourcecodes . عليك أن تتخلص من هؤلاء أولاً.

إليك طلب بحث يمكنه العثور على أرقام التعريف هذه:

SELECT DISTINCT sourcecode_id FROM 
   sourcecodes_tags tags LEFT JOIN sourcecodes sc ON tags.sourcecode_id=sc.id 
WHERE sc.id IS NULL;

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

يمكنك اتباع هذه الخطوات:

  1. أفلت العمود الذي حاولت تعيين قيد FK له.

  2. إضافته مرة أخرى وتعيين القيمة الافتراضية الخاصة به كـ NULL.

  3. حاول تعيين قيد المفتاح الخارجي مرة أخرى.


UPDATE sourcecodes_tags
SET sourcecode_id = NULL
WHERE sourcecode_id NOT IN (
  SELECT id FROM sourcecodes);

يجب أن يساعد على التخلص من تلك المعرفات. أو إذا لم يكن مسموحًا sourcecode_id null في sourcecode_id ، sourcecode_id بإزالة تلك الصفوف أو إضافة تلك القيم المفقودة إلى جدول sourcecodes .





mysql-error-1452