MySQLで既に作成してあるテーブルの設計を後から変更する方法について解説します。設計の変更とはカラムを追加したり、削除したり、テーブル名を変更するといった操作を指します。
目次
カラムの追加 ADD
カラムを追加するには次のように記述します。
ALTER TABLE テーブル名 ADD カラム名 型;
実際にカラムを追加してみましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL AUTO_INCREMENT, author_id INT, post_title VARCHAR(50) UNIQUE, PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'), (1, 'DockerでMySQLを使う方法'); -- カラムを追加 ALTER TABLE titles ADD view INT; -- テーブルの構造を確認 DESC titles;
実行結果は次のとおりです。
Field Type Null Key Default Extra id int NO PRI NULL auto_increment author_id int YES NULL post_title varchar(50) YES UNI NULL view int YES NULL
viewというカラムがINT型で追加されているのがわかります。
追加するカラムの位置を指定したい場合は次のように記述します。
ALTER TABLE テーブル名 ADD カラム名 型 FIRST; -- 一番上に追加 ALTER TABLE テーブル名 ADD カラム名 型 AFTER カラム名; 指定したカラムのあとに追加
実際に先ほどのviewカラムを一番上に追加してみましょう。
-- カラムを一番上に追加 ALTER TABLE titles ADD view INT FIRST; -- テーブルの構造を確認 DESC titles;
実行結果は次のとおりです。
Field Type Null Key Default Extra view int YES NULL id int NO PRI NULL auto_increment author_id int YES NULL post_title varchar(50) YES UNI NULL
viewカラムが一番上に追加されています。
カラムの削除 DROP
カラムを削除するには次のように記述します。
ALTER TABLE テーブル名 DROP カラム名;
実際に使ってみましょう。
-- カラムを一番上に追加 ALTER TABLE titles DROP post_title; -- テーブルの構造を確認 DESC titles;
実行結果は次のとおりです。
Field Type Null Key Default Extra id int NO PRI NULL auto_increment author_id int YES NULL
指定したpost_titleカラムがテーブルから削除されています。
カラムの変更 CHANGE
カラムを変更するには次のように記述します。
ALTER TABLE テーブル名 CHANGE 変更前のカラム名 変更後のカラム名 変更後の型;
実際に使ってみましょう。
-- author_idカラムをBIGINT型のviewカラムに変更 ALTER TABLE titles CHANGE author_id view BIGINT; -- テーブルの構造を確認 DESC titles;
実行結果は次のとおりです。
Field Type Null Key Default Extra id int NO PRI NULL auto_increment view bigint YES NULL post_title varchar(50) YES UNI NULL
author_idカラムがviewカラムに変更され、型もBIGINTに変更されているのがわかります。
カラムを変更する場合、MySQLはなるべく保存されているデータを変換して保持しようとしますが、データが消えてしまったり、エラーになってしまうこともあるので注意しましょう。
テーブル名の変更 RENAME
テーブル名を変更するには次のように記述します。
ALTER TABLE 元のテーブル名 RENAME 新しいテーブル名;
実際に使ってみましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( id INT NOT NULL AUTO_INCREMENT, author_id INT, post_title VARCHAR(50) UNIQUE, PRIMARY KEY (id) ); -- レコードを挿入 INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'), (1, 'DockerでMySQLを使う方法'); -- postsという名前のテーブルが既にある場合は削除 DROP TABLE IF EXISTS posts; -- titlesテーブルの名前をpostsに変更 ALTER TABLE titles RENAME posts; -- データベース内のテーブルの一覧を確認 SHOW TABLES;
新しいテーブル名(今回はposts)と同じ名前のテーブルが既に存在する場合はエラーになってしまうので、テーブル名を変更する前にpostsテーブルの有無を確認し、既に存在する場合は削除しています。
実行結果は次のとおりです。
Tables_in_test data_type data_types int_tests posts
titlesテーブルがpostsテーブルに名前変更されています。