MySQL "خطأ 1005 (Hy000): لا يمكن إنشاء جدول" Foo.#SQL-12C_4 "(Errno: 150)"
-
04-10-2019 - |
سؤال
كنت أعمل على إنشاء بعض الجداول في قاعدة البيانات 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" (الغلاف الدقيق) ، ولدت الخطأ ، وتم تصحيحها ببساطة تغيير غلاف.