MySQL添加DEFAULT值需字段允许NULL或同时指定NOT NULL并设默认值;DEFAULT仅影响新插入行,旧数据需UPDATE补全;5.7用CHANGE/MODIFY重定义列,8.0.13+支持ALTER COLUMN SET/DROP DEFAULT;TIMESTAMP默认CURRENT_TIMESTAMP每表限一个,DATETIME在8.0+更灵活。
MySQL 不允许直接对已存在且含非空数据的字段添加 DEFAULT 值,除非该字段本身声明为 NULL,或你同时指定 NOT NULL 并提供 DEFAULT(此时会尝试用默认值填充现有空行)。常见报错:ERROR 1138: Invalid use of NULL value 或隐式失败(如字段没变但实际未生效)。
实操建议:
SHOW COLUMNS FROM table_name LIKE 'column_name';
NOT NULL 且无默认值,添加默认值前需决定是否允许 NULL,或用 MODIFY COLUMN 显式重申类型+约束ALTER TABLE t1 MODIFY COLUMN c1 VARCHAR(50) DEFAULT 'unknown' NOT NULL; —— 这会重定义字段并设默认值,同时保留 NOT NULL
DEFAULT 只影响后续 INSERT 时省略该字段的行为,不会自动更新已有记录。想让旧数据也变成默认值,必须显式 UPDATE。
实操建议:
ALTER TABLE t1 ALTER COLUMN status SET DEFAULT 'active';(MySQL 8.0.13+ 支持 ALTER COLUMN ... SET DEFAULT)UPDATE t1 SET status = 'active' WHERE status IS NULL;(注意条件匹配逻辑)NOT NULL 且有脏数据(比如空字符串),得按业务含义判断是否要一并更新:UPDATE t1 SET status = 'active' WHERE status = '';
MySQL 5.7 不支持 ALTER COLUMN ... SET DEFAULT,只能用 CHANGE COLUMN 或 MODIFY COLUMN 重写整段列定义;而 MySQL 8.0.13+ 引入了更精准的 ALTER COLUMN 语法,语义清晰、不易误改其他属性。
实操建议:
ALTER TABLE t1 CHANGE COLUMN c1 c1 INT DEFAULT 0;(注意:列名重复写两次,否则会重命名)ALTER TABLE t1 ALTER COLUMN c1 SET DEFAULT 0;
ALTER TABLE t1 ALTER COLUMN c1 DROP DEFAULT;(两个版本都支持)对 TIMESTAMP 或 DATETIME 字段设 CURRENT_TIMESTAMP 默认值,MySQL 有隐式限制:一张表最多一个 TIMESTAMP 列能用 CURRENT_TIMESTAMP 作默认值(5.6/5.7 行为);8.0 开始 DATETIME 也支持,且允许多个,但首次定义时仍需注意顺序和触发时机。
实操建议:
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP):updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
TIMESTAMP 且已占用了默认 CURRENT_TIMESTAMP,新加类似字段会报错:ERROR 1067: Invalid default value for 'xxx' —— 此时要么删旧的,要么改用 DATETIME