Skip to content

ALTER 修改表

ALTER TABLE 语句用于修改现有表的结构。本章介绍如何使用 ALTER TABLE 添加、删除或修改列和约束。

基本语法

sql
ALTER TABLE table_name
ADD | DROP | MODIFY | CHANGE column_definition;

添加列

sql
-- 添加单列
ALTER TABLE users
ADD phone VARCHAR(20);

-- 添加多列
ALTER TABLE users
ADD phone VARCHAR(20),
ADD address VARCHAR(200);

-- 添加列并指定位置
ALTER TABLE users
ADD age INT AFTER name;

-- 添加列到第一位
ALTER TABLE users
ADD id INT FIRST;

删除列

sql
-- 删除单列
ALTER TABLE users
DROP COLUMN phone;

-- 删除多列
ALTER TABLE users
DROP COLUMN phone,
DROP COLUMN address;

修改列

MODIFY - 修改列定义

sql
-- 修改列类型
ALTER TABLE users
MODIFY age BIGINT;

-- 修改列并添加约束
ALTER TABLE users
MODIFY email VARCHAR(100) NOT NULL UNIQUE;

CHANGE - 重命名并修改列

sql
-- 重命名列并修改类型
ALTER TABLE users
CHANGE old_name new_name VARCHAR(100);

重命名表

sql
-- 重命名表
ALTER TABLE users
RENAME TO customers;

-- 或使用 RENAME TABLE
RENAME TABLE users TO customers;

添加约束

sql
-- 添加主键
ALTER TABLE users
ADD PRIMARY KEY (id);

-- 添加外键
ALTER TABLE orders
ADD FOREIGN KEY (user_id) REFERENCES users(id);

-- 添加唯一约束
ALTER TABLE users
ADD UNIQUE (email);

-- 添加检查约束
ALTER TABLE users
ADD CHECK (age >= 18);

删除约束

sql
-- 删除主键
ALTER TABLE users
DROP PRIMARY KEY;

-- 删除外键
ALTER TABLE orders
DROP FOREIGN KEY fk_user_id;

-- 删除索引
ALTER TABLE users
DROP INDEX idx_email;

修改表选项

sql
-- 修改存储引擎
ALTER TABLE users ENGINE = InnoDB;

-- 修改字符集
ALTER TABLE users
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改自增起始值
ALTER TABLE users AUTO_INCREMENT = 1000;

实战示例

添加时间戳字段

sql
ALTER TABLE users
ADD created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ADD updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

修改列为非空

sql
-- 先更新 NULL 值
UPDATE users SET email = 'default@example.com' WHERE email IS NULL;

-- 再修改列为非空
ALTER TABLE users
MODIFY email VARCHAR(100) NOT NULL;

最佳实践

  1. 修改前备份数据
  2. 在非高峰期执行
  3. 大表修改使用在线 DDL
  4. 测试环境先验证
  5. 使用事务(如果支持)

小结

  • ADD:添加列或约束
  • DROP:删除列或约束
  • MODIFY:修改列定义
  • CHANGE:重命名并修改列
  • RENAME:重命名表

下一步: 学习 DROP 删除表