在 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
。