سؤال

عندما أقوم بتنفيذ الاستعلامين التاليين (لقد قمت بتجريدهما إلى الضرورة القصوى):

mysql> CREATE TABLE foo(id INT PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;

أحصل على الخطأ التالية:الخطأ 1005 (HY000):لا يمكن إنشاء جدول "./test/bar.frm" (errno:150)

أين **** هو خطأي؟لم أجده وأنا أحدق في هذا لمدة نصف ساعة.

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

المحلول

FOREIGN KEY القيود

<اقتباس فقرة>   

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

وبي <م> اشتباه هو أنها لأنك لم تخلق foo كما ك InnoDB، كما كل شيء يبدو موافق.

وتحرير: من نفس الصفحة -

<اقتباس فقرة>   يجب أن يكون

وكل من الجداول ك InnoDB ويجب أن لا تكون الجداول المؤقتة.

نصائح أخرى

ويمكنك استخدام SHOW ENGINE INNODB STATUS القيادة للحصول على مزيد من المعلومات المحددة حول الخطأ.

وسوف تعطيك نتيجة لذلك مع عمود Status تحتوي على الكثير من النص.

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

------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create  table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.

لإنشاء مفتاح خارجي،

  1. يجب أن يكون لكل من العمود الرئيسي والعمود المرجعي نفس التعريف.
  2. يجب أن يكون محرك كلا الجدولين InnoDB.

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

تغيير الجدول [اسم الجدول] ENGINE=InnoDB;

وكان لي نفس المشكلة، بالنسبة لأولئك الذين يعانون من هذا أيضا:

وتحقق اسم الجدول من الجدول المشار إليه

وكنت قد نسيت الصورة "في نهاية اسمي الجدول

وعلى سبيل المثال جدول العملاء -> عملاء

:)

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

ودعونا نقول خلق بيان الجدول الرئيسي هو -

وCREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ووإنشاء بناء جملة الجدول relative_table حيث يتم تعيين قيد مفتاح خارجي من الجدول الأساسي -

وCREATE TABLE 'relative_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'salary' int(10) NOT NULL DEFAULT '',
 'grade' char(2) NOT NULL DEFAULT '',
 'record_id' char(10) DEFAULT NULL,
 PRIMARY KEY ('id'),
 CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

وهذا السيناريو هو بالتأكيد لينتهي الخلية خطأ 150 في حالة استخدام ك InnoDB.

لحل هذا، ونحن بحاجة إلى إضافة KEY لالعمود record_id في الجدول master_table ومن ثم الرجوع في الجدول relative_table لاستخدامها في foreign_key.

وأخيرا، إنشاء بيان للmaster_table، سوف يكون -

وCREATE TABLE 'master_table' (
 'id' int(10) NOT NULL AUTO_INCREMENT,
 'record_id' char(10) NOT NULL,
 'name' varchar(50) NOT NULL DEFAULT '',
 'address' varchar(200) NOT NULL DEFAULT '',
 PRIMARY KEY ('id'),
 KEY 'record_id' ('record_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

وكان لي نفس المشكلة جدا، وكان السبب هو "جمع" الأعمدة مختلفة. كان واحدا LATIN1 في حين كان البعض UTF8

وهذا قد يحدث أيضا إذا لم تعط اسم العمود الصحيح بعد الكلمة "المراجع".

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