MySQL Workbench でモデルを作成し、それをmysqlサーバーにインストールしようとしています。
ファイル>エクスポート>フォワードエンジニアSQL CREATEスクリプト...を使用すると、必要なすべての設定を含む、素敵な大きなファイルが出力されます。 MySQL GUIツール (具体的にはクエリブラウザ)に切り替えて、このスクリプトをロードします(ある公式のMySQLツールから別のツールに移行することに注意してください)。ただし、実際にこのファイルを実行しようとすると、同じエラーが何度も発生します。
SQLSTATE [HY000]:一般エラー:1005テーブル './srs_dev/location.frm'を作成できません(エラー番号: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が吐き出したファイルの一部です。
だから、私の質問は、私がやるべきだと思うことをしているときに、なぜこれが機能しないのですか?
バージョン情報:
外部キーのフィールドのタイプは、それらが参照している列のタイプと同じである必要があります。次のものがあります(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
フィールド(テーブルstate
およびbrand
内)をテーブルTINYINT
内のlocation
フィールドで参照しようとしています。それが不平を言っているエラーだと思います。そもそもどうやってそれが起こったのか、なぜゼロにするのかわからないFOREIGN_KEY_CHECKS
MySQLがエラーを診断するのを止めませんが、このタイプの不一致を修正するとどうなりますか?
このスレッドを見ている他の人にとって、このエラーが発生する理由はたくさんあります。
Errno 150、errno 121、およびその他のMySQL外部キーエラーの完全なリストについては、次のリンクを参照してください。
@juacalaの答えをチェックしました。しかし、私を助けませんでした。トラブルの原因を見つけたときに@ELIACOMに送信したメッセージは次のとおりです。
私はこの素晴らしい解決策の情報源を読んでいましたが、私の問題は解決されていません。 MyISAMのPKを指すFKをINNODBテーブルに追加しようとしていました。 MyIsamをINNODBに設定した後、機能しました。私はそれを実現する前にあなたのリスト全体をチェックしました。乾杯。