سؤال

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

هنا هو البرنامج النصي:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )

 ENGINE = InnoDB;


 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
   FOREIGN KEY (`field1`)
   REFERENCES `testdb`.`table1` (`field1` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)

 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

لقد قمت بتجربتها على Windows وUbuntu مع إصدارات مختلفة من MySQL ولم تنجح.

أيه أفكار؟

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

المحلول

وtable1.field1 لا يوجد مؤشر تعريف عليه.

وهذا يتطلب وضع قيود على FOREIGN KEY field1.

ومع هذا:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

وكل شيء يجب أن ثم العمل كما هو متوقع.

نصائح أخرى

وبينما كان يعمل مع MySQL طاولة العمل و MySQL 5.5.27، لقد واجهت مشكلة مماثلة. في بلدي القضية قضية كان مع حقول نوع INT. خطأ في جدول واحد كان INT غير الموقعة والرجوع الجدول كان INT.

واعتمادا على نسخة من الخلية قد تحتاج إلى إنشاء فهرس على table1.field1 أولا.

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

  • عدم تطابق نوع البيانات بين المفتاح الأساسي المشار إليه والمفتاح الخارجي المرجعي
  • المؤشرات.أي مفاتيح خارجية تقوم بفهرستها يجب أن تكون غير فارغة

تلميح آخر:

حتى عندما تبدو أنواع البيانات الخاصة بك متماثلة - في حالتي كان كلا العمودين VARCHAR(50) - هذا لا يكفي.

تحتاج أيضًا إلى التأكد من أن كلا العمودين لهما نفس الشيء COLLATION.

ولكن هناك سبب آخر، على الرغم من أن تشبه قليلا للآخرين: أنا كان يشير إلى الجدول الذي اتضح أن يكون المحرك MYISAM، بدلا من ك InnoDB

وسوف الخلية أيضا رمي هذا الخطأ إذا كان لديك الخطأ في الكتابة اسم الجدول اشارة. أنا سحبت شعري لحظة حتى أدركت أنني أخطأت بريد إلكتروني في foreign key (column1) references mistyped_table(column1)

وخيار (حسب الحالة) سيكون لتعطيل التحقق من التكامل الخلية:

SET FOREIGN_KEY_CHECKS = 0;

وإذا كان يعمل شيئا، حاول هذا:

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

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

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

وعلى سبيل المثال:

وإنشاء جدول إن لم يكن موجودا CADASTRO_MAQUINAS ( معرف VARCHAR (16)، مفتاح أساسي (رقم) )؛

وإنشاء جدول إن لم يكن موجودا INFOS ( Id_Maquina VARCHAR (16) NOT NULL، CONSTRAINT FK_infos_cadastro_maquinas مفتاح الخارجية (Id_Maquina) المراجع CADASTRO_MAQUINAS (رقم) )؛

إذا وأنا أحاول لإنشاء الجدول الثاني باستخدام cadastro_maquinas (حالات أقل) بدلا من CADASTRO_MAQUINAS، وسوف تتلقى هذا الخطأ.

وكنت تستخدم MySQL workBench. المسألة هي لا يمكنك استخدام نفس foreign key name، فإنها تحتاج إلى أن تكون unique. حتى إذا كان أكثر من جدول واحد ومرجع المفتاح الخارجي نفسه، في كل مرة يجب أن يكون هناك اسم unique معينة.

لقد حدث خطأ مماثل في أحد جداولي.عند تحديد العمود كان الترتيب مختلفًا، والذي نجح بمجرد تغيير كلا العمودين إلى نفس نوع الترتيب.

بعد قراءة معظم الحل المقترح هنا .لقد اعتقدت أنه قد يكون من المفيد أن أدرج فقط كل الاحتمالات التي يمكن أن تؤدي إلى هذا الخطأ.

1 ، تحقق من حالة العمود 2 ، تحقق من ترتيب الأعمدة 3 ، تحقق مما إذا كان هناك مفتاح تم إنشاؤه في كلا الجدولين للعمود (فريد ، أساسي)

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

وحتى هذا قد يحدث بسبب التضارب بين قاعدتي / حقول تعريفات محاولة للتحقق:

Field Type
Field Collation
Table Engine

وبالنسبة لي، كانت المشكلة مع استخدام CONSTRAINT في الاستعلام CREATE TABLE.

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

وعلى سبيل المثال:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

في هذه الحالة، فمن المهم استخدام ARTICLE_ID ونوع الحقل في تعريف FK في نفس الترتيب كما تظهر في المقالة الجدول الأساسي تعريف KEY.

في حالتي ربما كان الخلل الخادم اسقاط الجدول بنفس الاسم. اسقاط shcema كليا وإعادة إنشاء أنها تحل المشكلة.

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

تم كسر

وتبين ك InnoDB، انظر: <لأ href = "https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was- ، في حين حذف-مجربة لواحد؟ LQ = 1 "> https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted -مع-مجربة، ل؟ LQ = 1

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

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

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

وخلق دائما سيد الجداول / الأم أولا، ثم خلق لكم التفاصيل / الجداول التابعة.

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