سؤال

لقد قمت بإنشاء نموذج مع MySQL Workbench. وأنا الآن محاولة تثبيته إلى خادم MySQL.

استخدام ملف> تصدير> مهندس للأمام SQL إنشاء البرنامج النصي ... يخرج ملف كبير لطيف بالنسبة لي، مع كل الإعدادات التي أطلبها. أنا التبديل إلى أدوات MySQL واجهة المستخدم الرسومية (متصفح الاستعلام على وجه التحديد) وتحميل هذا البرنامج النصي (لاحظ أنني ذاهب إلى شكل أداة MySQL رسمية واحدة إلى أخرى). ومع ذلك، عندما أحاول فعلا تنفيذ هذا الملف، أحصل على نفس الخطأ مرارا وتكرارا

SQLSTATE [HY000]: خطأ عام: 1005 لا يمكن إنشاء جدول './srs_dev/location.frm' (errno: 150)

"حسنا"، أقول لنفسي، هناك خطأ ما في طاولة الموقع. لذلك أنا أتحقق من التعريف في ملف الإخراج.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

-- -----------------------------------------------------
-- Table `state`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `state` ;

CREATE  TABLE IF NOT EXISTS `state` (
  `state_id` INT NOT NULL AUTO_INCREMENT ,
  `iso_3166_2_code` VARCHAR(2) NOT NULL ,
  `name` VARCHAR(60) NOT NULL ,
  PRIMARY KEY (`state_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `brand`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `brand` ;

CREATE  TABLE IF NOT EXISTS `brand` (
  `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  `domain` VARCHAR(45) NOT NULL ,
  `manager_name` VARCHAR(100) NULL ,
  `manager_email` VARCHAR(255) NULL ,
  PRIMARY KEY (`brand_id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `location`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `location` ;

CREATE  TABLE IF NOT EXISTS `location` (
  `location_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(255) NOT NULL ,
  `address_line_1` VARCHAR(255) NULL ,
  `address_line_2` VARCHAR(255) NULL ,
  `city` VARCHAR(100) NULL ,
  `state_id` TINYINT UNSIGNED NULL DEFAULT NULL ,
  `postal_code` VARCHAR(10) NULL ,
  `phone_number` VARCHAR(20) NULL ,
  `fax_number` VARCHAR(20) NULL ,
  `lat` DECIMAL(9,6) NOT NULL ,
  `lng` DECIMAL(9,6) NOT NULL ,
  `contact_url` VARCHAR(255) NULL ,
  `brand_id` TINYINT UNSIGNED NOT NULL ,
  `summer_hours` VARCHAR(255) NULL ,
  `winter_hours` VARCHAR(255) NULL ,
  `after_hours_emergency` VARCHAR(255) NULL ,
  `image_file_name` VARCHAR(100) NULL ,
  `manager_name` VARCHAR(100) NULL ,
  `manager_email` VARCHAR(255) NULL ,
  `created_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  PRIMARY KEY (`location_id`) ,
  CONSTRAINT `fk_location_state`
    FOREIGN KEY (`state_id` )
    REFERENCES `state` (`state_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_location_brand`
    FOREIGN KEY (`brand_id` )
    REFERENCES `brand` (`brand_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE INDEX `fk_location_state` ON `location` (`state_id` ASC) ;

CREATE INDEX `fk_location_brand` ON `location` (`brand_id` ASC) ;

CREATE INDEX `idx_lat` ON `location` (`lat` ASC) ;

CREATE INDEX `idx_lng` ON `location` (`lng` ASC) ;

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

] mysql -u admin -p -D dbname < path/to/create_file.sql

وأحصل على نفس الخطأ. لذلك أبدأ في Google هذه المشكلة والعثور على جميع أنواع الحسابات التي تحدث عن خطأ في جداول Innodb Style التي تفشل مع المفاتيح الأجنبية، والإصلاح هو إضافة "Set Movie_Key_checks = 0؛" إلى البرنامج النصي SQL. حسنا، كما ترون، هذا بالفعل جزء من الملف الذي يبصقه Workbench MySQL.

لذلك، سؤالي هو بعد ذلك، لماذا لا يعمل هذا عندما أفعل ما أعتقد أنه من المفترض أن أفعل؟

النسخة معلومات:

  • MySQL: 5.0.45.

  • أدوات واجهة المستخدم الرسومية: 1.2.17
  • Workbench: 5.0.30
هل كانت مفيدة؟

المحلول

يجب أن يكون نوع الحقل في مفتاح أجنبي هو نفسه نوع العمود الذي يشيرون إليه. لديك ما يلي (القص):

CREATE  TABLE IF NOT EXISTS `state` (
  `state_id` INT NOT NULL AUTO_INCREMENT ,
...
CREATE  TABLE IF NOT EXISTS `brand` (
  `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
...
CREATE  TABLE IF NOT EXISTS `location` (
...
  `state_id` TINYINT UNSIGNED NULL DEFAULT NULL ,
...
  `brand_id` TINYINT UNSIGNED NOT NULL ,

لذلك أنت تحاول الرجوع إلى INT الحقول (في الجداول state و brand) مع TINYINT الحقول في الجدول location. وبعد أعتقد أن هذا هو الخطأ الذي يشكو منه. لست متأكدا كيف وصل الأمر في المقام الأول، أو لماذا تصريف FOREIGN_KEY_CHECKS لا يتوقف MySQL من تشخيص الخطأ، ولكن ماذا يحدث إذا قمت بإصلاح عدم تطابق هذا النوع؟

نصائح أخرى

بالنسبة للآخرين الذين ينظرون إلى هذا الموضوع، هناك الكثير من الأسباب التي يمكنك الحصول عليها هذا الخطأ:

راجع الرابط التالي للحصول على قائمة كاملة ل Errno 150، Irrno 121 وغيرها من أخطاء المفاتيح الخارجية MySQL:

أخطاء المفاتيح الأجنبية MySQL و Errno 150

فقط فحص إجابة Juacala. ولكن لم يساعدني. إليك الرسالة التي أرسلتها liaaccom عندما وجدت مصدرا للمشاكل:

كنت أقرأ هذا المصدر الكبير للحلول، لكن مشكلتي ليست معالجة. كنت أحاول إضافة FK في جدول InnoDB يشير إلى PK في MyISAM. بعد إعداد MyISAM إلى InnoDB يعمل. راجعت قائمتك بالكامل قبل تحقيق ذلك. هتافات.

كان لدي نفس القضية. بطريقة أو بأخرى لم ألاحظ ضبط قيمة Auto_incrent على معرف الجدول. ربما يساعد شخص ما.

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