是,会丢失原有默认值——modify column 本质重建字段定义,不保留原 default 约束,必须显式重写 default 才能保留;低版本需用 change column 或 modify 重申完整定义,8.0.13+ 可用 alter column set default/drop default。

ALTER TABLE MODIFY COLUMN 会丢失原有默认值
直接用 MODIFY COLUMN 改字段类型或长度时,MySQL 默认清空原 DEFAULT 值。比如你执行:
ALTER TABLE users MODIFY COLUMN name VARCHAR(100);即使原来
name 有 DEFAULT 'unknown',改完后查 SHOW CREATE TABLE users 就发现默认值没了。
原因在于 MODIFY COLUMN 本质是重建字段定义,不保留原默认约束。想保留,必须显式重新指定 DEFAULT。
- 安全做法:把
MODIFY拆成两步——先CHANGE COLUMN或MODIFY,再单独ALTER ... SET DEFAULT - 更稳妥的写法是直接用
CHANGE COLUMN并带上完整定义:ALTER TABLE users CHANGE COLUMN name name VARCHAR(100) DEFAULT 'unknown';
- 注意:如果字段允许
NULL,DEFAULT NULL是合法的;但显式写DEFAULT NULL和不写默认值在行为上不同(前者插入NULL不触发警告,后者可能报错)
ALTER TABLE ALTER COLUMN SET DEFAULT 的正确语法
MySQL 8.0.13+ 支持标准 SQL 的 SET DEFAULT 语法,但必须严格匹配字段当前定义。常见错误是漏掉数据类型或约束,导致报错 ERROR 1064。
例如给已有字段加默认值:
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';这行只在 MySQL 8.0.13 及以上有效;低于该版本会报语法错误。
- 低版本(如 5.7)必须用
CHANGE COLUMN或MODIFY COLUMN重申整个字段定义 - 如果字段已有
NOT NULL约束,新默认值不能为NULL(除非同时去掉NOT NULL) - 对 ENUM 或 SET 类型字段,
DEFAULT值必须是枚举/集合中的合法项,否则报ERROR 1067
删除默认值不能只写 DROP DEFAULT
很多人尝试 ALTER TABLE t DROP DEFAULT col,这是无效语法。MySQL 不支持独立的 DROP DEFAULT 子句。
真正删除默认值的方式只有一种:
ALTER TABLE users ALTER COLUMN name DROP DEFAULT;注意关键词是
DROP DEFAULT,且必须配合 ALTER COLUMN —— 这个语法从 MySQL 8.0.13 开始引入。
- MySQL 5.7 或更低版本,只能用
CHANGE COLUMN重定义字段,省略DEFAULT部分 - 执行后记得验证:
SHOW CREATE TABLE users查看输出中是否还有DEFAULT关键字 - 删除默认值不影响已有数据,但后续插入不指定该字段时会报错(如果字段又
NOT NULL且无默认值)
修改默认值对已有数据没影响,但影响 INSERT 行为
改 DEFAULT 只改变后续 INSERT 语句中未显式提供该字段时的填充逻辑,不会更新表里已存在的 NULL 或空值。
比如:
ALTER TABLE logs ALTER COLUMN level SET DEFAULT 'INFO';执行后,之前所有
level 为 NULL 的行还是 NULL,只有新插入且没写 level 的行才会自动填 'INFO'。
- 如果想批量更新旧数据,得额外执行
UPDATE logs SET level = 'INFO' WHERE level IS NULL; - 默认值在客户端连接层也可能被绕过:某些 ORM 或驱动在生成 INSERT 时会显式传
NULL,此时数据库默认值不生效 - 分区表、临时表、内存表对
DEFAULT的支持略有差异,生产环境建议先在同类型表上验证
ALTER COLUMN ... SET DEFAULT 和 DROP DEFAULT 在 5.7 和 8.0 之间差异很大,跨版本迁移时容易卡在这儿。











