MySQL "خطأ 1005 (Hy000): لا يمكن إنشاء جدول" Foo.#SQL-12C_4 "(Errno: 150)"

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

سؤال

كنت أعمل على إنشاء بعض الجداول في قاعدة البيانات foo, ، لكن في كل مرة ينتهي بها الأمر إلى Errno 150 فيما يتعلق بالمفتاح الخارجي. أولاً ، إليك الكود الخاص بي لإنشاء الجداول:

CREATE TABLE Clients
(
client_id                CHAR(10)  NOT NULL ,
client_name              CHAR(50)  NOT NULL ,
provisional_license_num  CHAR(50)  NOT NULL ,
client_address           CHAR(50)  NULL ,
client_city              CHAR(50)  NULL ,
client_county            CHAR(50)  NULL ,
client_zip               CHAR(10)  NULL ,
client_phone             INT       NULL ,
client_email             CHAR(255) NULL ,
client_dob               DATETIME  NULL ,
test_attempts            INT       NULL
);
CREATE TABLE Applications
(
application_id   CHAR(10) NOT NULL ,
office_id        INT      NOT NULL ,
client_id        CHAR(10) NOT NULL ,
instructor_id    CHAR(10) NOT NULL ,
car_id           CHAR(10) NOT NULL ,
application_date DATETIME NULL 
);
CREATE TABLE Instructors
(
instructor_id      CHAR(10)  NOT NULL ,
office_id          INT       NOT NULL ,
instructor_name    CHAR(50)  NOT NULL ,
instructor_address CHAR(50)  NULL ,
instructor_city    CHAR(50)  NULL ,
instructor_county  CHAR(50)  NULL ,
instructor_zip     CHAR(10)  NULL ,
instructor_phone   INT       NULL ,
instructor_email   CHAR(255) NULL ,
instructor_dob     DATETIME  NULL ,
lessons_given      INT       NULL 
);
CREATE TABLE Cars
(
car_id             CHAR(10) NOT NULL ,
office_id          INT      NOT NULL ,
engine_serial_num  CHAR(10) NULL ,
registration_num   CHAR(10) NULL ,
car_make           CHAR(50) NULL ,
car_model          CHAR(50) NULL 
);
CREATE TABLE Offices
(
office_id       INT       NOT NULL ,
office_address  CHAR(50)  NULL ,
office_city     CHAR(50)  NULL ,
office_County   CHAR(50)  NULL ,
office_zip      CHAR(10)  NULL ,
office_phone    INT       NULL ,
office_email    CHAR(255) NULL 
);
CREATE TABLE Lessons
(
lesson_num     INT            NOT NULL ,
client_id      CHAR(10)       NOT NULL ,
date           DATETIME       NOT NULL ,
time           DATETIME       NOT NULL ,
milegage_used  DECIMAL(5, 2)  NULL ,
progress       CHAR(50)       NULL 
);
CREATE TABLE DrivingTests
(
test_num     INT       NOT NULL ,
client_id    CHAR(10)  NOT NULL ,
test_date    DATETIME  NOT NULL ,
seat_num     INT       NOT NULL ,
score        INT       NULL ,
test_notes   CHAR(255) NULL 
);

ALTER TABLE Clients ADD PRIMARY KEY (client_id);
ALTER TABLE Applications ADD PRIMARY KEY (application_id);
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id);
ALTER TABLE Offices ADD PRIMARY KEY (office_id);
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num);
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id);
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);

هذه هي الأخطاء التي أحصل عليها:

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY
(car_id) REFERENCES Cars (car_id);
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)

ركضت SHOW ENGINE INNODB STATUS الذي يعطي وصف خطأ أكثر تفصيلا:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4:
 FOREIGN KEY (car_id) REFERENCES Cars (car_id):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
------------

لقد بحثت في stackoverflow وأماكن أخرى عبر الإنترنت - صادف منشور مدونة مفيد هنا مع مؤشرات حول كيفية حل هذا الخطأ - لكن لا يمكنني معرفة الخطأ الذي يحدث. سيكون موضع تقدير أي مساعدة!

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

المحلول

يجب أن تجعل car_id مفتاحًا أساسيًا في السيارات.

نصائح أخرى

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

تأكد من أن جميع الحقول المشار إليها لها نفس النوع ونفس الترتيب!

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

CREATE Table FOO ();

و:

CREATE Table BAR () ENGINE=INNODB;

إذا حاولت إنشاء قيد من شريط الجدول إلى جدول FOO ، فلن يعمل على بعض إصدارات MySQL.

إصلاح المشكلة بمتابعة:

CREATE Table FOO () ENGINE=INNODB;

خفية ، لكن هذا الخطأ جعلني لأنني نسيت إعلان عمود smallint على أنه غير موقّع لمطابقة الجدول الحالي المشار إليه والذي كان "Smallint غير موقّع". تسبب وجود واحد غير موقّع وغير موقّع في MySQL لمنع إنشاء المفتاح الخارجي على الطاولة الجديدة.

id smallint(3) not null

لا يتطابق ، من أجل المفاتيح الأجنبية ،

id smallint(3) unsigned not null

لقد حصلت على هذا الخطأ الذي لا قيمة له ولا قيمة له عندما حاولت:

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;

كانت مشكلتي في جدول تعليقاتي ، تم تعريف user_id على النحو التالي:

`user_id` int(10) unsigned NOT NULL

لذلك ... في حالتي ، كانت المشكلة مع الصراع بين عدم وجود فارغ ، وعلى حذف مجموعة فارغة.

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

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

CREATE TABLE1 (
  FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
  FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;

إلى

CREATE TABLE2 (
  Field3 varchar(64) NOT NULL PRIMARY KEY,
  Field4 varchar(64) NOT NULL,
  CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;

سوف تفشل لأن لديهم charsets مختلفة. هذا فشل آخر دقيق حيث يعيد MySQL نفس الخطأ.

أستخدم Ubuntu Linux ، وفي حالتي ، كان الخطأ ناتجًا عن بناء جملة العبارة غير الصحي

رمز خطأ MySQL 150: تم تشكيل قيود المفاتيح الخارجية بشكل غير صحيح

تغيير بناء جملة الاستعلام من

alter table scale add constraint foreign key (year_id) references year.id;

إلى

alter table scale add constraint foreign key (year_id) references year(id);

تم التصليح.

يجب أن يكون الحقل المشار إليه "مفتاحًا" في الجدول المشار إليه ، وليس بالضرورة مفتاحًا أساسيًا. لذلك يجب أن يكون "car_id" إما مفتاحًا أساسيًا أو يتم تعريفه مع عدم وجود قيود فريدة وفريدة من نوعها في جدول "Cars".

علاوة على ذلك ، يجب أن يكون كلا الحقولان من نفس النوع والترتيب.

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

  • فتح/private/etc/my.conf
  • تحت # خادم MySQL, ، تغير max_allowed_packet من 1M إلى 4M (قد تحتاج إلى تجربة هذه القيمة.)
  • إعادة تشغيل mysql

تم استيراد قاعدة البيانات بنجاح بعد ذلك.

لاحظ أنني أقوم بتشغيل MySQL 5.5.12 لنظام التشغيل Mac OS X (x86 64 بت).

تحقق لجعل الحقل الذي تشير إليه هو تطابق دقيق مع المفتاح الخارجي ، في حالتي لم يتم توقيعها وتم توقيع الآخر ، لذا قمت بتغييره للتو ولم يتطابق مع ذلك

ALTER TABLE CUSTORAL_INFORMATION أضف القيد FK_CUSTOMER_INFORMATION1 المفتاح الأجنبي (user_id) المراجع users(id) في حذف سلسلة على تحديث سلسلة

تم حلها:

تحقق من التأكد من أن Primary_key و Foreign_key متطابقة تمامًا مع أنواع البيانات. إذا تم توقيع واحد آخر غير موقّع ، فسيتم فشله. الممارسة الجيدة هي التأكد من أن كلاهما غير موقعة.

كنت أستخدم اسم مفتاح خارجي مكرر.

إعادة تسمية اسم FK حل مشكلتي.

توضيح:

كان لكلا الجدولين قيدًا يسمى PK1 و FK1 ، إلخ. إعادة تسميته/جعل الأسماء فريدة من نوعها حل المشكلة.

يجب أن يكون العمود المشار إليه فهرس عمود واحد أو العمود الأول في فهرس العمود متعدد ، ونفس النوع ونفس الترتيب.

طاولتي لها مجموعات مختلفة. يمكن عرضه عن طريق إصدار حالة جدول العرض مثل table_name ويمكن تغيير الترتيب عن طريق إصدار جدول Alter table_name تحويل إلى مجموعة الأحرف UTF8.

كل شيء ، لقد حللت مشكلة وأردت مشاركتها:

كان لدي هذا الخطأ <> كانت المشكلة في ذلك في بياني:

ALTER TABLE SYSTEM_REGISTRO_DE_MODIFICACION إضافة مفتاح خارجي (USUARIOMODIFICADOR_ID) المراجع USUARIO (ID) على تقييد الحذف ؛

لقد كتبت الغلاف بشكل غير صحيح: إنه يعمل في Windows Wamp ، ولكن في Linux MySQL ، يكون الأمر أكثر صرامة مع الغلاف ، لذا فإن الكتابة "Usuario" بدلاً من "Usuario" (الغلاف الدقيق) ، ولدت الخطأ ، وتم تصحيحها ببساطة تغيير غلاف.

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