18

MySQL Workbenchを使用してモデルを作成し、それをmysqlサーバーにインストールしようとしています。

[ファイル]>[エクスポート]>[フォワードエンジニアSQLCREATEスクリプト...]を使用すると、必要なすべての設定を含む、素敵な大きなファイルが出力されます。MySQL GUIツール(具体的にはクエリブラウザ)に切り替えて、このスクリプトをロードします(1つの公式MySQLツールから別のツールに移行することに注意してください)。ただし、実際にこのファイルを実行しようとすると、同じエラーが何度も発生します。

SQLSTATE [HY000]:一般エラー:1005テーブルを作成できません'./srs_dev/location.frm'(errno:150)

「OK」、私は自分自身に言います、ロケーションテーブルに何か問題があります。そこで、出力ファイルの定義を確認します。

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

そして、私は同じエラーを受け取ります。そこで、この問題をグーグルで検索し、外部キーで失敗するInnoDBスタイルのテーブルのエラーについて話しているすべての種類のアカウントを見つけました。修正は「SETFOREIGN_KEY_CHECKS=0;」を追加することです。SQLスクリプトに。ご覧のとおり、これはすでにMySQLWorkbenchが出力したファイルの一部です。

それで、私の質問は、私がやるべきだと思うことをしているときに、なぜこれが機能しないのかということです。

バージョン情報:

  • MySQL:5.0.45

  • GUIツール:1.2.17
  • ワークベンチ:5.0.30
4

4 に答える 4

40

外部キーのフィールドのタイプは、それらが参照している列のタイプと同じである必要があります。次の(Snipping)があります:

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したがって、テーブル内のフィールドで(テーブル内statebrand)フィールドを参照しようとしていTINYINTますlocation。それが不平を言っているエラーだと思います。そもそもそれがどのように発生したのか、またはゼロ化しFOREIGN_KEY_CHECKSてもMySQLがエラーを診断するのを止めないのはなぜかわかりませんが、このタイプの不一致を修正するとどうなりますか?

于 2009-07-06T02:09:03.697 に答える
9

このスレッドを見ている他の人にとって、このエラーが発生する理由はたくさんあります。

errno 150、errno 121、およびその他のMySQL外部キーエラーの完全なリストについては、次のリンクを参照してください。

MySQL外部キーエラーとErrno150

于 2012-06-13T00:31:18.047 に答える
0

@juacalaの答えをチェックしました。しかし、私を助けませんでした。トラブルの原因を見つけたときに@ELIACOMに送信したメッセージは次のとおりです。

私はこのすばらしい解決策の情報源を読んでいましたが、私の問題は解決されていません。MyISAMのPKを指すFKをINNODBテーブルに追加しようとしました。MyIsamをINNODBに設定した後、それは機能しました。私はそれを実現する前にあなたのリスト全体をチェックしました。乾杯。

于 2013-10-07T17:13:10.137 に答える
-2

私も同じ問題を抱えていました。どういうわけか、auto_increment値をテーブルIDに設定していることに気づきませんでした。多分それは誰かを助けます。

于 2012-07-17T17:23:03.827 に答える