在 MySQL 中,MODIFY
、CHANGE
和 RENAME TO
都是 ALTER TABLE
語句的一部分,用于修改表的結構,但它們的作用和使用場景有所不同。
1.?MODIFY
作用:用于修改表中現有列的定義,但不能修改列名。
你可以使用 MODIFY
來更改列的數據類型、長度、約束(如 NOT NULL
、DEFAULT
等),但不能更改列的名稱。
語法:
ALTER TABLE table_name MODIFY column_name new_data_type [new_constraints];
示例:
-- 將 age 列的數據類型從 INT 改為 TINYINT,并允許為 NULL
ALTER TABLE users MODIFY age TINYINT NULL;-- 修改列的默認值
ALTER TABLE users MODIFY status ENUM('active', 'inactive') DEFAULT 'active';
2.?CHANGE
作用:用于修改列名,同時也可以修改列的數據類型和約束。功能比 MODIFY
更強大。
CHANGE
需要指定舊列名和新列名,即使你只想修改數據類型而不改名,也必須重復列名。
語法:
ALTER TABLE table_name CHANGE old_column_name new_column_name new_data_type [new_constraints];
示例:
-- 修改列名,并改變數據類型
ALTER TABLE users CHANGE user_age age TINYINT NOT NULL;-- 只修改數據類型,不改列名(需要重復列名)
ALTER TABLE users CHANGE age age SMALLINT UNSIGNED;
3.?RENAME TO
作用:用于重命名整個表,而不是修改列。
注意:RENAME TO
是用于表級別的重命名,不是列。
語法:
ALTER TABLE old_table_name RENAME TO new_table_name;
或者使用 RENAME
:
RENAME TABLE old_table_name TO new_table_name;
示例:
-- 將表 users 重命名為 customers
ALTER TABLE users RENAME TO customers;
下面提供一個完整的 MySQL 示例,演示 MODIFY
、CHANGE
和 RENAME TO
的使用。
🧩 完整示例:從創建表到使用 MODIFY、CHANGE、RENAME TO
-- 1. 創建一個測試表 users
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,user_name VARCHAR(50) NOT NULL,user_age INT,email VARCHAR(100),status VARCHAR(20) DEFAULT 'active'
);-- 插入一些測試數據
INSERT INTO users (user_name, user_age, email) VALUES
('Alice', 25, 'alice@example.com'),
('Bob', 30, 'bob@example.com');
? 使用?MODIFY
:修改列定義(不改列名)
-- 將 user_age 列的數據類型從 INT 改為 TINYINT,并設置為 NOT NULL
ALTER TABLE users MODIFY user_age TINYINT NOT NULL;-- 修改 email 列,增加唯一約束
ALTER TABLE users MODIFY email VARCHAR(100) UNIQUE;-- 修改 status 列,使用 ENUM 類型并保留默認值
ALTER TABLE users MODIFY status ENUM('active', 'inactive', 'suspended') DEFAULT 'active';
🔍 注意:
MODIFY
不能修改列名。例如下面這條是錯誤的:ALTER TABLE users MODIFY user_name username VARCHAR(50); -- ? 錯誤!
? 使用?CHANGE
:修改列名和/或列定義
-- 修改列名:將 user_name 改為 username,同時保持數據類型
ALTER TABLE users CHANGE user_name username VARCHAR(50) NOT NULL;-- 修改列名并改變數據類型
ALTER TABLE users CHANGE user_age age TINYINT UNSIGNED;-- 只修改數據類型,不改列名(需要重復列名)
ALTER TABLE users CHANGE email email VARCHAR(150) NOT NULL;
🔁
CHANGE
相當于“先刪后增”列,因此即使只改類型,也要寫兩次列名。
? 使用?RENAME TO
:重命名整個表
-- 將表 users 重命名為 customers
ALTER TABLE users RENAME TO customers;
或者使用 RENAME TABLE
語法(效果相同):
RENAME TABLE customers TO users; -- 再改回來
🔍 查看最終表結構
DESCRIBE users;
輸出結果應類似:
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int | NO | PRI | (auto_increment) | |
username | varchar(50) | NO | NULL | ||
age | tinyint unsigned | NO | NULL | ||
varchar(150) | NO | UNI | NULL | ||
status | enum('active','inactive','suspended') | YES | active |
總結對比
命令 | 作用 | 是否可改列名 | 是否可改數據類型 |
---|---|---|---|
MODIFY | 修改列定義 | ? 不可以 | ? 可以 |
CHANGE | 修改列名和定義 | ? 可以 | ? 可以 |
RENAME TO | 重命名表 | ? 不適用 | ? 不適用 |
💡 提示:如果你只需要修改列的類型或約束,使用
MODIFY
更清晰;如果需要改列名,必須使用CHANGE
;如果要改表名,則使用RENAME TO
。