MySQL Workbenchでalter tableの自動生成が出来たので、手順をメモしておきます。
MySQL Workbenchは以下からDL出来ます。
(要アカウント。)
http://dev.mysql.com/downloads/workbench/
ログイン(サインアップ)画面の"No thanks, just start my download."からアカウント無しでDL可能です。(Twitterでご教示頂きました。有難うございます。)
(1)
MySQL Workbenchで以下のような設計をして、DBを作成します。
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,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `mwb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mwb` ;
-- -----------------------------------------------------
-- Table `mwb`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mwb`.`users` (
`id` INT NOT NULL ,
`name` VARCHAR(255) NOT NULL ,
`age` INT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
(2)
MySQL Workbenchで以下のような設計に修正します。修正内容は適当です。尚、MySQL Workbench上で修正しただけで、実際に実行はしません。
* users.nameをnull可に
* users.nameにインデックス"idx"を追加
* users.school_idを追加(外部キー)
* users.ageをusers.school_idの下に
* users.ageをnull不可に
* schoolsテーブル追加
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,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Table `mwb`.`schools`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mwb`.`schools` (
`id` INT NOT NULL ,
`name` VARCHAR(255) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mwb`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mwb`.`users` (
`id` INT NOT NULL ,
`school_id` INT NOT NULL ,
`age` INT NOT NULL ,
`name` VARCHAR(255) NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_users_schools_idx` (`school_id` ASC) ,
INDEX `idx` (`name` ASC) ,
CONSTRAINT `fk_users_schools`
FOREIGN KEY (`school_id` )
REFERENCES `mwb`.`schools` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
(3)
現在、DBは(1)の状態です。つまり、(2)にするalter tableが欲しい状態です。
MySQL Workbenchで Database > Synchronize Model...と進んで、接続情報を入力して、Continueをクリックします。その後の画面を指示通りに進めると、以下のSQLが出力されました。
Executeを押すと実際に実行されるので注意して下さい。
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,ALLOW_INVALID_DATES';
ALTER TABLE `mwb`.`users` CHANGE COLUMN `age` `age` INT(11) NOT NULL AFTER `school_id` , CHANGE COLUMN `name` `name` VARCHAR(255) NULL DEFAULT NULL , ADD COLUMN `school_id` INT(11) NOT NULL AFTER `id` ,
ADD CONSTRAINT `fk_users_schools`
FOREIGN KEY (`school_id` )
REFERENCES `mwb`.`schools` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION
, ADD INDEX `fk_users_schools_idx` (`school_id` ASC)
, ADD INDEX `idx` (`name` ASC) ;
CREATE TABLE IF NOT EXISTS `mwb`.`schools` (
`id` INT(11) NOT NULL ,
`name` VARCHAR(255) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
alter tableが正しく出力されない場合は、MySQL WorkbenchのSchema Nameと実際のDB名が一致していない可能性があります。
P.S.
ER MasterはDBインポートからのドキュメント自動生成専用で使うことにする。。。