修改表
ALTER TABLE 用于修改已有表的结构——加列、删列、改类型、重命名。
建表不是一锤子买卖。业务在发展,需求在变化。广州飞翔科技刚起步时,员工表只需要姓名和基本工资就够了。后来业务扩展了,要加绩效奖金、社保扣除、个税计算,还得补上账户余额。这时候如果删表重建,已有数据就全丢了;ALTER TABLE 正是为了解决这个痛点——在保留数据的同时演进结构。
常见的操作有:ADD(新增列或约束)、DROP COLUMN(删除列)、RENAME COLUMN(重命名列)、MODIFY COLUMN(修改列类型或约束,MySQL / Oracle 语法)、ALTER COLUMN(修改列类型,SQL Server / MS Access 语法)。要注意的是,修改已有列的数据类型时,如果新类型装不下旧数据(比如把 VARCHAR(100) 缩成 VARCHAR(20)),数据库会直接拒绝,保护你的数据不被截断。
不同数据库的语法略有差异。MySQL 和 Oracle 用 MODIFY COLUMN 改类型,SQL Server 和 MS Access 用 ALTER COLUMN,而重命名列的语法各家更是五花八门——MySQL 和 MariaDB 用 CHANGE COLUMN,SQL Server 用 sp_rename 存储过程,Oracle 用 RENAME COLUMN。
标准写法:
-- 添加新列(通用)
ALTER TABLE 表名 ADD 列名 数据类型 约束;
-- 删除列(通用)
ALTER TABLE 表名 DROP COLUMN 列名;
-- 重命名列
-- MySQL / MariaDB:
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 数据类型;
-- SQL Server:
EXEC sp_rename '表名.旧列名', '新列名', 'COLUMN';
-- Oracle:
ALTER TABLE 表名 RENAME COLUMN 旧列名 TO 新列名;
-- 修改列类型
-- MySQL / Oracle:
ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型 新约束;
-- SQL Server / MS Access:
ALTER TABLE 表名 ALTER COLUMN 列名 新数据类型;
以飞翔科技为例。员工表随着公司发展需要不断调整:
-- 业务扩展,需要记录员工账户余额
ALTER TABLE employees
ADD account_balance DECIMAL(10,2) DEFAULT 0.00
COMMENT '员工账户余额,发工资后累加';
-- 公司升级为集团,名称需要更新
ALTER TABLE employees
MODIFY COLUMN company_name VARCHAR(100) DEFAULT '广州飞翔科技集团有限公司';
-- 字段名不够直观,把 dept_code 改成 dept_id(MySQL 语法)
ALTER TABLE employees
CHANGE COLUMN dept_code dept_id TINYINT DEFAULT 1;
-- 查看修改后的表结构
DESC employees;
新增的 account_balance 列默认值为 0.00,已有的老员工记录会自动填上这个默认值,不会出现 NULL。公司名称的默认值也一并更新了——下次插入新员工时,company_name 会自动使用新的集团名称。dept_code 改名为 dept_id 后,表结构更贴合实际业务语义。整个过程数据毫发无损,这就是 ALTER TABLE 的优雅之处。