SQL ALTER TABLE
学习修改表结构 · 难度:进阶 · +15XP
SQL ALTER TABLE 修改表结构
在实际开发中,数据库表的结构很少能从一开始就设计得完美无缺。随着业务需求的变化,你可能需要往现有表中添加新字段、修改字段类型、重命名列或删除不再需要的列。SQL 的 ALTER TABLE 语句就是用来在表创建之后修改其结构的工具,是数据库模式迁移中最常用的命令之一。
添加列(ADD COLUMN)
-- 基本语法:添加单列
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
-- 添加列并设置默认值
ALTER TABLE students ADD COLUMN email TEXT DEFAULT '未填写';
-- 添加多列(MySQL 语法)
ALTER TABLE students
ADD COLUMN phone VARCHAR(20),
ADD COLUMN address VARCHAR(100);
修改列定义(MODIFY/ALTER COLUMN)
不同数据库修改列的语法差异较大:
-- MySQL:修改列的数据类型
ALTER TABLE students MODIFY COLUMN score DECIMAL(5,2);
-- MySQL:同时修改类型和默认值
ALTER TABLE students MODIFY COLUMN status VARCHAR(10) DEFAULT 'active';
-- PostgreSQL / SQL Server
ALTER TABLE students ALTER COLUMN score TYPE DECIMAL(5,2);
-- SQLite:不支持直接修改列,需要重建表
重命名列(RENAME COLUMN)
-- MySQL / MariaDB
ALTER TABLE students RENAME COLUMN name TO full_name;
-- PostgreSQL
ALTER TABLE students RENAME COLUMN name TO full_name;
-- SQL Server
EXEC sp_rename 'students.name', 'full_name', 'COLUMN';
删除列(DROP COLUMN)
-- 删除单列
ALTER TABLE students DROP COLUMN email;
-- MySQL 删除多列
ALTER TABLE students DROP COLUMN phone, DROP COLUMN address;
-- 注意:SQLite 不支持 DROP COLUMN(3.35.0 版本后开始支持)
添加和删除约束
-- 添加主键
ALTER TABLE students ADD PRIMARY KEY (id);
-- 添加外键
ALTER TABLE scores ADD CONSTRAINT fk_student
FOREIGN KEY (student_id) REFERENCES students(id);
-- 添加唯一约束
ALTER TABLE users ADD CONSTRAINT uq_email UNIQUE (email);
-- 删除约束
ALTER TABLE users DROP INDEX uq_email; -- MySQL
ALTER TABLE users DROP CONSTRAINT uq_email; -- PostgreSQL
操作注意事项
- 备份先行:修改表结构前务必备份数据,ALTER 操作不可撤销
- 锁表影响:在大型生产表上执行 ALTER 可能会长时间锁表,影响业务
- 默认值处理:添加 NOT NULL 列时必须提供 DEFAULT 值,否则已有行的该列值为 NULL 会报错
- 数据类型转换:修改列类型可能造成数据截断或精度丢失
- SQLite 限制:SQLite 对 ALTER TABLE 支持有限,复杂修改需重建表
实战任务
- 向 students 表添加 email 和 phone 列
- 将 score 列的类型修改为 DECIMAL(5,2)
- 将 name 列重命名为 student_name