سؤال

انا لدي طاولتان:

مؤلف الجدول: معرف (integer) ، upert_name (varchar) ، first_name (varchar) ، last_name (varchar) ، preferred_name (varchar).

الجدول المشترك: ID (Integer) Author1id (Integer) ، Author2Id (Integer) ، paper_id (integer) (معرف الورقة المؤلفة المشتركة المشار إليها في هذا الرابط)

أرغب في إضافة قيود مفاتيح خارجية بحيث تشير المؤلف 1 و Author2Id في تأليف شارك إلى ID في المؤلف. لقد حددت الجداول على هذا النحو:

CREATE TABLE Author(ID INT, author_name VARCHAR(100), preferred_name VARCHAR(100), first_name VARCHAR(100), last_name VARCHAR(100), PRIMARY KEY(ID)) ENGINE=INNODB;

CREATE TABLE CoAuthored(ID INT, author1ID INT, author2ID INT, paper_ID INT);

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

ALTER TABLE CoAuthored ADD foreign key (author1ID) references Author(ID) on delete cascade on update cascade;

ينفذ هذا جيدًا ، لكن عندما أحاول إضافة AA Tuple الذي يحتوي على مؤلف 1 غير موجود في ID ، فإنه يتيح لي القيام بذلك ، مما يعني أن القيد المفتاح الخارجي لا يعمل.

ماذا أحتاج إلى فعله بشكل مختلف؟ حاولت إنشاء كلا الجدولين محرك = innodb في عبارات إنشاء ، ولكن بعد ذلك سأحصل على خطأ 1005 لا يمكن إنشاء جدول.

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

المحلول

من عند: https://web.archive.org/web/1/http://articles.techrepublic٪2ECom٪2ECOM/5100-10878_11-6035435.html

من أجل إعداد علاقة مفتاح خارجي بين جدولين MySQL ، يجب استيفاء ثلاثة شروط:

  1. يجب أن يكون كلا الجدولين من نوع جدول Innodb.

  2. يجب فهرسة الحقول المستخدمة في العلاقة الرئيسية الخارجية.

  3. يجب أن تكون الحقول المستخدمة في العلاقة الرئيسية الخارجية متشابهة في نوع البيانات.

هام: بالنسبة لجداول غير InnoDB ، يتم تجاهل شرط المفتاح الخارجي.

نصائح أخرى

هل يمكنك تجربة "المحرك = innodb"

قيود المفاتيح الخارجية/قيود المفاتيح تعمل مع جداول InnoDB فقط :)

--هتافات

بادئ ذي بدء: تحتاج إلى تحديد جميع الجداول المشاركة في المفاتيح الأجنبية لتكون innodb. Myisam ببساطة لا يدعم المفاتيح الأجنبية.

مشكلتك هنا (خطأ 1005) مربكة بعض الشيء. إذا قمت بعمل ALTER TABLE, ، هذا يعني أن هناك قيمة في أحد حقول المفاتيح الخارجية التي لا يوجد أي إشارة في جدول آخر.

عند إنشاء جداول ، تأكد من إنشاء جدول "الوالد" أولاً ، ثم الجدول الثاني والثالث.

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