线上订单表要加一个来源字段,开发丢过来一句 ALTER TABLE orders ADD source VARCHAR(32)。DBA 追问:加在哪一列后面,默认值多少,大表准备锁多久。表里已经有两千多万行。

mysql增加字段语句的基本格式是表名、ADD COLUMN、字段名、类型,后面跟默认值和位置。位置不写就追加到末尾,写 FIRST 或 AFTER 可以插到指定位置。关键字顺序不能乱,ADD COLUMN 写在表名后面。

一条完整的语句

下面这条给 users 表加 age 字段,放在 nickname 后面,不允许为空,默认 0,还带注释。

ALTER TABLE users ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄' AFTER nickname;

一次加多个字段就写多个 ADD COLUMN,用逗号隔开。加完用 SHOW CREATE TABLE users 或 DESC users 确认,别只看客户端刷新出来的结果。

默认值决定老数据长什么样

新字段对已有行会填默认值,没写 DEFAULT 的,MySQL 会按类型给隐式值,严格模式下还可能直接报错。线上表最好显式写上 DEFAULT,NOT NULL 和默认值一起考虑,别让老数据出现一串 NULL。

大表加字段会锁多久

MySQL 8.0 的在线加字段多数情况能走 INSTANT 或 INPLACE,5.7 及更早版本往往要重建表,数据量大时锁表时间很难估。加字段前看表有多大,挑低峰期,先在从库或测试库跑一遍。执行时加 ALGORITHM=INPLACE, LOCK=NONE 可以强制走在线方式,不支持会直接报错,比默默锁表强。

加完字段还要做什么

加完字段还要回填数据、改 ORM 映射、清缓存,别只改数据库就完事。需要索引的字段,索引单独加,和加字段分开执行,出问题好定位。上线前备份,回滚语句先写好:ALTER TABLE users DROP COLUMN age,mysql增加字段语句本身不复杂,难的是选位置、定默认值和挑时机,从库延迟也要看一眼,别加完字段应用直接报 Unknown column。