MySQL でカラムの型を変更するのは、データベースを扱う際によくある作業です。新しいデータ要件に対応したり、パフォーマンスを最適化したりするために、カラムの型を変更する必要が出てくることがあります。このチュートリアルでは、ALTER TABLE 文を使ってカラムの型を変更する方法を、実践的な例とともに解説します。
ALTER TABLE 文を理解する
ALTER TABLE 文は、既存のテーブルの構造を変更するために使用します。カラムやインデックスの追加、削除、変更が可能です。カラムの型を変更する場合の基本構文は次のとおりです。
ALTER TABLE table_name MODIFY COLUMN column_name new_data_type;
構文を詳しく見ていきましょう。
-
table_name: 変更したいカラムを含むテーブルの名前です。 -
column_name: 変更したいカラムの名前です。 -
new_data_type: カラムに割り当てる新しいデータ型です。
例: MySQL でカラムの型を変更する
次の構造を持つ users というテーブルを考えてみましょう。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
age INT
);
初期の構造は次のコマンドで確認できます。
DESCRIBE users;
期待される出力:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
age カラムの型を変更する
年齢の範囲は小さいため、容量を節約する目的で age カラムを INT から TINYINT に変更したいとします。
ALTER TABLE users MODIFY COLUMN age TINYINT;
上記のコマンドを実行すると、age カラムが TINYINT に変更されます。変更を確認しましょう。
DESCRIBE users;
期待される出力:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(50) | YES | | NULL | |
| age | tinyint | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
TINYINT は INT に比べて格納できる数値の範囲が狭い点に注意してください。ご想像のとおり、これによりテーブル内のデータを変換する際に問題が生じる可能性があります。この影響については、後述の Conversion Issues セクションで説明します。
username カラムの型を変更する
次に、より長いユーザー名を使えるように、username カラムを VARCHAR(50) から VARCHAR(100) に変更してみましょう。
ALTER TABLE users MODIFY COLUMN username VARCHAR(100);
変更を確認しましょう。
DESCRIBE users;
期待される出力:
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(100) | YES | | NULL | |
| age | tinyint | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
データ変換の問題への対処
カラムの型を変更する際、既存のデータが新しい型と互換性がないと問題が発生することがあります。MySQL は既存のデータの変換を試みますが、変換できない値があると、NULL 値になったり、切り捨てられたりする場合があります。
例: データの切り捨て - INT から TINYINT
今回の INT から TINYINT への変更例では、TINYINT が INT と同じ範囲の値をサポートしていないため、データが切り捨てられる可能性があります。
- INT は -2,147,483,648 から 2,147,483,647(符号付き)、または 0 から 4,294,967,295(符号なし)の値を格納できます。
- TINYINT は -128 から 127(符号付き)、または 0 から 255(符号なし)の値を格納できます。
変換時には次のことが起こります。
a. カラム内の INT 値が TINYINT で格納できる範囲内であれば、問題なく変換されます。
b. INT 値が TINYINT の範囲を超える場合は、TINYINT の範囲に収まるように切り捨てられます。たとえば INT 値が 300 の場合、符号付き TINYINT では 127、符号なし TINYINT では 255 に切り捨てられます。
データが新しいデータ型の上限を超える場合、SQL モードの設定によっては、変換中に MySQL が警告やエラーを出すことがあります。
例: 互換性のない型への変更
次のケースを考えてみましょう。
ALTER TABLE users MODIFY COLUMN age CHAR(3);
これにより age カラムが CHAR(3) に変更されます。ただし、年齢が 999 を超える場合は、先頭の 3 文字に切り捨てられます。情報の損失を防ぐため、新しい型が既存のデータを扱えることを必ず確認してください。
まとめ
MySQL でカラムの型を変更するには、ALTER TABLE 文と MODIFY COLUMN 句を使用します。変更内容は必ず確認し、データ変換の問題に注意してください。このチュートリアルでは、実際のプロジェクトで自信を持って活用できるよう、実践的な例を使ってこの作業の手順を紹介しました。
ALTER TABLE 文を理解して活用することで、MySQL のデータベース構造を効果的に管理・最適化できます。
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studio は以前の MySQL のワークフローを完全に置き換えてくれました。高速で直感的で、データベース作業がまた楽しくなりました。」
「多くのデータベース GUI を試してきましたが、Beekeeper は機能とシンプルさのバランスが絶妙です。とにかくちゃんと動きます。」