it-swarm.asia

رمز الخطأ: 1215. لا يمكن إضافة قيد المفتاح الخارجي (المفاتيح الخارجية)

CREATE DATABASE my_db;

CREATE TABLE class (
  classID int NOT NULL AUTO_INCREMENT,
  nameClass varchar(255),
  classLeader varchar(255),
  FOREIGN KEY (classLeader) REFERENCES student(studentID),
  PRIMARY KEY (classID));

CREATE TABLE student (
  studentID int NOT NULL AUTO_INCREMENT,
  lastName varchar(255),
  firstName varchar(255),
  classID int,
  FOREIGN KEY (classID) REFERENCES class(classID),
  PRIMARY KEY (studentID));

أحاول التأكد من تناسق البيانات بين الجداول باستخدام المفتاح الخارجي حتى يتمكن نظام إدارة قواعد البيانات من التحقق من الأخطاء ؛ ومع ذلك ، يبدو أننا لا نستطيع القيام بذلك لسبب ما. ما هو الخطأ وهل هناك بديل؟ أيضًا ، عندما أقوم بملء جدول يحتوي على مفتاح خارجي ، لا أستطيع ملء الحقل المخصص للمفتاح (المفاتيح) الخارجي ، أليس كذلك؟ أيضا ، هل يعتبر المفتاح الأجنبي مفتاحًا على الإطلاق؟

33
GEORGE Reed

المشكلة الأكثر احتمالا هي هذا الخط:

FOREIGN KEY (classLeader) REFERENCES student(studentID),

نوع البيانات من classLeader هو VARCHAR (255). يجب أن تطابق نوع البيانات من العمود المشار إليه ... student.studentID. وبالطبع ، يجب أن يكون الجدول student موجودًا ، ويجب أن يكون العمود studentID موجودًا ، ويجب أن يكون العمود studentID هو PRIMARY KEY لجدول الطلاب (على الرغم من أنني نعتقد أن MySQL تسمح لهذا أن يكون مفتاحًا فريدًا ، بدلاً من كونه مفتاحًا أوليًا ، أو حتى يكون لديه فهرس به.)

في أي حال ، ما هو مفقود هنا هو الإخراج من SHOW CREATE TABLE student;


هناك عدم تطابق نوع البيانات.

لا يمكن أن يكون العمود classLeader VARCHAR(255) مرجع مفتاح خارجي إلى studentID INT.

يجب أن تتطابق أنواع البيانات من العمودين.

50
spencer7593

أنت تتلقى هذا الخطأ نظرًا لأن في FOREIGN KEY (classLeader) REFERENCES student(studentID) نوع البيانات studentID و classLeader مختلف. يجب أن يكون نوع العمود الأساسي الأساسي وعمود المفتاح الخارجي هو نفسه.

من موقع MySQL:

Corresponding columns in the foreign key and the referenced key must have similar data types. 
The size and sign of integer types must be the same. 
The length of string types need not be the same. 
For nonbinary (character) string columns, the character set and collation must be the same.
8
Rohan

على الرغم من أنها إجابة متأخرة ، إلا أنني آمل أن تساعد القليل من الناس.

واجهت نفس المشكلة. ولكن ، هنا كانت أنواع البيانات نفسها أيضًا.

ولكن ، عندما راجعت عبارة إنشاء جدول ، وجدت أن جدولًا واحدًا تم إنشاؤه باستخدام محرك يسمى "MyISAM" وآخر يستخدم "InnoDB".

SHOW CREATE TABLE <TABLE NAME>

ثم غيرت محركي الجدولين إلى "InnoDB" وعملت (تمكنت من إنشاء مفتاح خارجي)

4
John Prawyn

تم حل الخطأ:

لإنشاء مفتاح خارجي لجدول مثل هذا

CREATE TABLE USERS_SO (
    USERNAME VARCHAR(10) NOT NULL,
    PASSWORD VARCHAR(32) NOT NULL,
    ENABLED SMALLINT,
    PRIMARY KEY (USERNAME)
);

الرمز أدناه يعمل بشكل جيد

CREATE TABLE AUTHORITIES_SO (
    USERNAME VARCHAR(10) NOT NULL,
    AUTHORITY VARCHAR(10) NOT NULL,
    FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME)
);
1
MS Ibrahim

تأكد من وجود رأس وتذييل في تفريغ sql وإلا سترى كل أنواع الأخطاء عند استعادة قاعدة البيانات

يجب أن يبدو العنوان كما يلي أدناه:

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;
/*!40101 SET @[email protected]@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;

يجب أن يبدو تذييل الصفحة كما يلي -

/*!40111 SET [email protected]_SQL_NOTES */;
/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */;
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */;
/*!40101 SET [email protected]_COLLATION_CONNECTION */;

نأمل أن يساعد أعلاه

هتاف S

0
stevensagaar

مسح ال Engine, CHARSET, COLLATE من الاستعلام ، ثم الخروج. إنه يعمل من أجلي.

0
Niyas