MySQLテーブル構造の変更に関する完全ガイド
テーブルの構造は決して不変ではありません。ビジネスニーズが変化した際には、ALTER TABLEが頼りになります。
このレッスンでは、テーブル構造を変更するためのすべての操作について、体系的に解説します。
graph TB
A[ALTER TABLE Operation] --> B[ADD COLUMN<br/>Add Field]
A --> C[DROP COLUMN<br/>Delete Field]
A --> D[MODIFY<br/>Modification Type/Constraints]
A --> E[CHANGE<br/>Rename Field]
A --> F[RENAME<br/>Modify Table Name]
A --> G[AUTO_INCREMENT<br/>Auto-increment Settings]
A --> H[ADD/DROP CONSTRAINT<br/>Constraint Management]
1. 学習内容
- ALTER TABLE:列の追加、削除、変更
- テーブル名および列名を変更する
- フィールドの型と制約を変更する
- AUTO_INCREMENT 自動インクリメントの設定
- DEFAULT デフォルト値の管理
2. 要件変更の実話
(1) 課題:ニーズの変化
プロダクトマネージャーは次のように述べた:
「ユーザーテーブルに『携帯電話番号』フィールドを追加し、ユーザー名の文字数を50から100に変更してください。」
ALTER TABLE の使い方がわからない場合は、テーブルを削除して再作成するしか方法がありません。ただし、その場合はすべてのデータが失われてしまいます。
(2) ALTER TABLE に関する解決策
SQL
-- Add a mobile phone number field
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Change the username length
ALTER TABLE users MODIFY COLUMN username VARCHAR(100) NOT NULL;
メリット: データが失われることはなく、数秒で完了します。
3. フィールドを追加する
▶ 例:列の追加
SQL
-- Add a Single Field
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Add a field and specify its position
ALTER TABLE users ADD COLUMN avatar VARCHAR(255) AFTER username;
-- Add to the beginning of the table
ALTER TABLE users ADD COLUMN uuid CHAR(36) FIRST;
-- Add Multiple Fields
ALTER TABLE users
ADD COLUMN address VARCHAR(200),
ADD COLUMN city VARCHAR(50),
ADD COLUMN country VARCHAR(50) DEFAULT 'China';
出力:
TEXT
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
4. フィールドの削除
▶ 例:DROP COLUMN
SQL
-- Delete a Single Field
ALTER TABLE users DROP COLUMN phone;
-- Delete Multiple Fields
ALTER TABLE users DROP COLUMN address, DROP COLUMN city;
⚠️ 注意: フィールドを削除すると、その列のデータは完全に削除され、復元することはできません!
5. フィールドの変更
(1) MODIFY 対 CHANGE
| コマンド | 編集可能なコンテンツ | 構文 |
|---|---|---|
| 変更 | タイプ、制約、位置 | MODIFY column new_type [constraints] |
| 変更 | 名前、タイプ、制約 | CHANGE old_name new_name new_type [constraints] |
▶ 例:MODIFY—型の変更
SQL
-- Modify Field Type
ALTER TABLE users MODIFY COLUMN username VARCHAR(100) NOT NULL;
-- Change the field type and move it to the specified location
ALTER TABLE users MODIFY COLUMN email VARCHAR(150) FIRST;
-- Modify Field Default Values
ALTER TABLE users MODIFY COLUMN status VARCHAR(20) DEFAULT 'active';
▶ 例:CHANGE—フィールド名の変更
SQL
-- Rename Field
ALTER TABLE users CHANGE COLUMN username user_name VARCHAR(100) NOT NULL;
-- Rename and Change Type
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(30);
6. テーブルの名前変更
▶ 例:RENAME
SQL
-- Method 1: RENAME TO
ALTER TABLE users RENAME TO customers;
-- Method 2: RENAME TABLE
RENAME TABLE users TO customers;
-- Rename Multiple Tables at Once
RENAME TABLE
old_users TO users,
old_orders TO orders;
7. AUTO_INCREMENT の設定
▶ 例:自動インクリメントの設定
SQL
-- Create a table with an auto-increment column
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
);
-- Insert Data (id auto-generated)
INSERT INTO products (name) VALUES ('iPhone');
INSERT INTO products (name) VALUES ('MacBook');
-- View Current Accumulated Value
SHOW CREATE TABLE products\G
-- Modify the Auto-Increment Start Value
ALTER TABLE products AUTO_INCREMENT = 1000;
-- Insert New Data (id starts from 1000)
INSERT INTO products (name) VALUES ('iPad');
出力:
TEXT
+----+---------+
| id | name |
+----+---------+
| 1 | iPhone |
| 2 | MacBook |
| 1000| iPad |
+----+---------+
8. デフォルト値の管理
▶ 例:デフォルト値の変更
SQL
-- Add a default value
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';
-- Delete the default value
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
-- Edit the default value for created_at
ALTER TABLE orders ALTER COLUMN order_date SET DEFAULT (CURRENT_DATE);
9. 制約の追加・削除
▶ 例:制約管理
SQL
-- Add a Primary Key
ALTER TABLE users ADD PRIMARY KEY (id);
-- Delete Primary Key
ALTER TABLE users DROP PRIMARY KEY;
-- Add a unique constraint
ALTER TABLE users ADD UNIQUE (email);
-- Delete the unique constraint
ALTER TABLE users DROP INDEX email;
-- Add a Foreign Key
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(id);
-- Delete Foreign Key
ALTER TABLE orders DROP FOREIGN KEY fk_customer;
-- Add CHECK Constraints
ALTER TABLE employees ADD CONSTRAINT chk_age CHECK (age >= 18);
-- Delete CHECK Constraints
ALTER TABLE employees DROP CHECK chk_age;
10. 一括編集の実践ガイド
▶ 例:複数の変更を一度に適用する
SQL
ALTER TABLE users
ADD COLUMN phone VARCHAR(20) AFTER email,
ADD COLUMN avatar VARCHAR(255),
MODIFY COLUMN username VARCHAR(150) NOT NULL,
DROP COLUMN temp_field,
ADD UNIQUE (phone);
❓ よくある質問
Q
ALTER TABLE はテーブルをロックしますか?A MySQL 8.0 では、ほとんどの
ALTER TABLE 操作はオンライン DDL をサポートしており、テーブルをロックしません。ただし、主キーやカラムのデータ型の変更などの操作では、テーブルがロックされる場合があります。Q フィールドを変更するとデータが失われますか?
A MODIFY または CHANGE を使用して列のデータ型を変更する場合、新しいデータ型で元のデータを格納できないと、データが切り捨てられるか、エラーが返されます。列の名前を変更しても、データが失われることはありません。
Q ALTER TABLE 文はロールバックできますか?
A いいえ。ALTER TABLE は DDL 操作であり、実行時に自動的にコミットされるため、ロールバックすることはできません。この操作を実行する前に、データをバックアップしておくことをお勧めします。
Q 大きすぎるテーブルを変更するにはどうすればよいですか?
A 巨大なテーブル(数千万行)に対して
ALTER TABLE操作を行うと、処理が非常に遅くなる可能性があります。pt-online-schema-change や gh-ost などのツールを使用して、テーブルをオンラインで変更することをお勧めします。📖 まとめ
- 列の追加 フィールドを追加します。その位置(FIRST/AFTER)を指定できます。
- DROP COLUMN 列を削除します。データは完全に失われます。
- MODIFY はフィールドの型と制約を変更します。CHANGE では、フィールド名の変更も可能です。
- テーブル名の変更 テーブルの名前を変更する
- AUTO_INCREMENT 自動インクリメントの開始値を制御します
- ALTER COLUMN SET/DROP DEFAULT デフォルト値の管理
- ADD/DROP CONSTRAINT 主キー、外部キー、一意性、およびCHECK制約を管理する
📝 練習問題
-
基本問題(難易度 ⭐):
usersテーブルにphoneフィールド(VARCHAR(20))を追加し、emailフィールドの後に配置してください。 -
上級演習(難易度 ⭐⭐):
ordersテーブルを作成した後、amountフィールドのデータ型を INT から DECIMAL(10,2) に変更し、デフォルト値を 'pending' とするstatusフィールドを追加してください。 -
チャレンジ問題(難易度:⭐⭐⭐):テーブル構造の変更計画を立案してください。v1からv2へ移行するには、3つの列を追加し、1つの列を削除し、2つの列のデータ型を変更する必要があります。完全な
ALTER TABLEステートメントを記述してください。



