January 13, 2013

MySQL Workbenchでalter tableを自動生成する

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インポートからのドキュメント自動生成専用で使うことにする。。。

No comments:

Post a Comment