سؤال

أحصل على هذا الخطأ في خلق MySQL. انا افعل:

CREATE TABLE `blogReply` (

    `Id`      INT(24)      NOT NULL AUTO_INCREMENT COMMENT 'Primary Key of This Table',
    `blogId`  INT(24)      NOT NULL COMMENT 'Blog where this reply was posted',
    `userId`  INT(24)      NULL COMMENT 'User the blog was posted by',
    `name`    VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Name of the user that the reply was posted by',
    `email`   VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Email of the user that the reply was posted by',
    `http`    VARCHAR(300) NULL DEFAULT 'Unknown' COMMENT 'The Webaddress of the user that the reply was posted by',
    `message` TEXT         NOT NULL COMMENT 'text of the blog',
    `votes`   INT(10)      DEFAULT 0 COMMENT 'Rating of the Blog',
    `ratedBy` TEXT         COMMENT 'People who have already Voted on this blog',
    `dateReg` BIGINT       NOT NULL COMMENT 'Date the User was Registered',

    PRIMARY KEY (`Id`),

    CONSTRAINT `FK_userId` FOREIGN KEY(`userId`)
        REFERENCES `user` (`Id`)
        ON DELETE SET NULL
        ON UPDATE CASCADE,

    CONSTRAINT `FK_blogId` FOREIGN KEY(`blogId`)
        REFERENCES `blog` (`Id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE

) ENGINE = InnoDB;

أيه أفكار؟ ينص الخطأ: Can't create table './xxxxxxxx/blogReply.frm' (errno: 121)

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

المحلول

تحقق من أن جميع قيودك مكتوبة بشكل صحيح بشكل صحيح، تحقق أيضا من أنه لا يوجد أي طاولات أخرى تستخدم أسماء القيد FK_USERID أو FK_BLOGID

نصائح أخرى

خطأ 121 هو قضية قيود مفتاح أجنبية. أول شيء يجب التحقق منه هو أن التعريفات الرئيسية الأجنبية على ما يرام (جميع الجداول وأسماء الحقول صحيحة، إلخ).

يمكنك محاولة تعطيل الشيكات الرئيسية الأجنبية قبل إنشاء الجدول كذلك، مثل هذا:

SET FOREIGN_KEY_CHECKS = 0;

يحتوي الجانب السلبي على الأخطاء السلبية في وقت لاحق عند إعادة تمكين الشيكات الرئيسية الخاصة بك (تعيينه إلى 1)، ومع ذلك، إذا كان هذا هو الحال، فهذا يعني أن لديك بعض السجلات غير الصالحة في مكان تداخل مع إنشاء المفتاح الأجنبي وبعد

ومع ذلك، يمكن أن تحدث هذه المشكلة أيضا إذا كنت تقوم بتوجيه ملفات قاعدة البيانات يدويا، مثل إعادة تسمية الجسدي data/your_database_name الدليل. لا يمكن ل InnoDB ربط التغييرات الجسدية من هذا القبيل إلى مساحة الملعقة، لذلك الأوساب مع Internals.

إذا كان هذا هو ما قمت به، فإن الحل الذي يعمل بشكل أفضل هو نقل قاعدة البيانات القديمة إلى المكان الذي كان فيه، خذ تفريغ أو تصدير منه، ويفعل DROP DATABASE على ذلك قبل إعادة الاستيراد.

يرجى التحقق من أن المفتاح الأجنبي الذي تقوم بإنشائه هو نفسه في جميع الجوانب مثل Datatype مع عمود الجدول المشار إليه. يجب أن يكون كل اسم مفتاح أجنبي فريد من نوعه بالنسبة لتلك الجداول التي يتم إنشاؤها، ويجب عدم استخدامها في طاولات أخرى. بالنسبة للمشكلة أعلاه، لا ينبغي استخدام اسم المفتاح الأجنبي "FK_USERID" في أي جدول آخر.

في هذه المشكلة في MySQL 5.5 ولكنها تعمل بشكل جيد في MySQL 5.6. كانت المشكلة لأن اسم القيد يتطلع فريدا ولكن إذا كان هذا اسم طويل ويتم اقتطاعه أن تصبح غير فريدة من نوعها، على سبيل المثال:

long_constraint_name_1, long_constraint_name_2 ممكن ان يصبح long_constraint_name_

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