MySQL 8.0 仅允许在 DEFAULT 中使用 CURRENT_TIMESTAMP、NOW()、LOCALTIME、LOCALTIMESTAMP(限 DATETIME/TIMESTAMP 列)、CURRENT_USER()(限字符列且需 STORED 或触发器)及字面量或简单表达式;UUID()、RAND()、MD5()、自定义函数等一律不支持,报 ERROR 3105。

MySQL 8.0 不支持在列定义的 DEFAULT 中直接使用动态函数(如 NOW() 以外的大多数函数),哪怕该函数是确定性的。你写 DEFAULT UUID() 或 DEFAULT MD5(RAND()) 会直接报错 ERROR 1064 或 ERROR 3105 ——这不是权限或配置问题,是语法硬限制。
哪些函数能在 DEFAULT 中用?只有少数内置时间/常量函数
MySQL 8.0 允许在 DEFAULT 子句中使用的函数极其有限,仅包括:
-
CURRENT_TIMESTAMP、NOW()、LOCALTIME、LOCALTIMESTAMP(仅限DATETIME/TIMESTAMP列) -
CURRENT_USER()(仅限TEXT或字符类型列,且必须显式声明为STORED虚拟列或配合触发器) - 字面量和简单表达式,如
DEFAULT 'abc'、DEFAULT (1 + 1)(注意括号是必须的)
像 UUID()、RAND()、MD5()、自定义函数 my_hash(),全都不行。尝试执行:
ALTER TABLE users ADD COLUMN token VARCHAR(36) DEFAULT UUID();
会明确报错:ERROR 3105 (HY000): The value specified for generated column or default value cannot contain a non-deterministic function. ——即使 UUID() 在函数上下文中被标记为 NOT DETERMINISTIC,它在 DEFAULT 场景下连这个判断机会都没有,直接被语法层拦截。
想实现“插入时自动填 UUID”,只能靠 GENERATED COLUMN + 触发器或应用层
真正可行的替代路径有两条,没有第三条:
-
方案一(推荐):用存储生成列(STORED GENERATED COLUMN)+ 触发器兜底
先建一个虚拟列生成 UUID,再用BEFORE INSERT触发器填充真实列(因为生成列不能设为PRIMARY KEY或加索引,而多数 UUID 场景需要):ALTER TABLE users ADD COLUMN token_gen VARCHAR(36) STORED GENERATED ALWAYS AS (UUID());<br>ALTER TABLE users ADD COLUMN token VARCHAR(36);<br>DELIMITER $$<br>CREATE TRIGGER users_set_token BEFORE INSERT ON users<br>FOR EACH ROW<br>BEGIN<br> IF NEW.token IS NULL THEN<br> SET NEW.token = UUID();<br> END IF;<br>END$$<br>DELIMITER ;
-
方案二:彻底放弃 DEFAULT,由应用或存储过程控制
在 INSERT 语句中显式调用:INSERT INTO users (name, token) VALUES ('alice', UUID());;或者封装进存储过程,避免漏写
为什么不能用自定义函数做 DEFAULT?连声明都过不了
即使你已设置 log_bin_trust_function_creators = 1 并创建了 DETERMINISTIC 函数,例如:
CREATE FUNCTION gen_token() RETURNS VARCHAR(36)<br>DETERMINISTIC<br>READS SQL DATA<br>BEGIN RETURN UUID(); END;
然后尝试:ALTER TABLE users ADD COLUMN x VARCHAR(36) DEFAULT gen_token();
依然失败,报错 ERROR 3105。原因很直接:MySQL 的 DEFAULT 解析器根本不进入函数调用流程,它只认白名单里的几个内置函数。自定义函数不在解析范围内,连“是否确定性”都不会去查。
真正容易被忽略的是:这个限制和是否开启 binlog、是否主从复制完全无关,它是 DDL 语法解析阶段的静态检查。哪怕你在单机本地测试,也绕不过去。别浪费时间调 sql_mode 或改变量,该报错照报。











