404 Not Found

404 Not Found


nginx

MySQLテーブル構造の変更に関する完全ガイド

テーブルの構造は決して不変ではありません。ビジネスニーズが変化した際には、ALTER TABLEが頼りになります。

このレッスンでは、テーブル構造を変更するためのすべての操作について、体系的に解説します。

100%
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. 学習内容


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 などのツールを使用して、テーブルをオンラインで変更することをお勧めします。

📖 まとめ


📝 練習問題

  1. 基本問題(難易度 ⭐)users テーブルに phone フィールド(VARCHAR(20))を追加し、email フィールドの後に配置してください。

  2. 上級演習(難易度 ⭐⭐)orders テーブルを作成した後、amount フィールドのデータ型を INT から DECIMAL(10,2) に変更し、デフォルト値を 'pending' とする status フィールドを追加してください。

  3. チャレンジ問題(難易度:⭐⭐⭐):テーブル構造の変更計画を立案してください。v1からv2へ移行するには、3つの列を追加し、1つの列を削除し、2つの列のデータ型を変更する必要があります。完全なALTER TABLEステートメントを記述してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%