MySQL设置time_upd字段默认Unix时间戳遇504错误求助
MySQL字段默认值设置问题

此前我将int类型的time字段设置为默认Unix格式时间值,新增条目时该字段可接收1970年以来的Unix格式时间。
我尝试为time_upd字段做同样设置,但多次尝试均失败。使用mysqlnd 8.3.30版本执行以下SQL语句时请求卡住,最终返回504错误:
ALTER TABLE table MODIFY COLUMN time_upd INT NOT NULL DEFAULT UNIX_TIMESTAMP();
解决方法
排查表锁与阻塞进程
执行ALTER TABLE时,若表被未提交的读写事务占用,会触发锁等待超时。先执行SHOW PROCESSLIST;查看当前进程,杀掉占用目标表的阻塞进程后,重新执行修改语句。改用TIMESTAMP类型简化设置
MySQL的TIMESTAMP原生支持自动时间更新,比INT+UNIX_TIMESTAMP()的组合更稳定高效,完全满足需求:ALTER TABLE table MODIFY COLUMN time_upd TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;该设置会在新增记录时自动填充当前时间,更新记录时自动刷新字段值。
拆分操作适配大数据量表
若表数据量庞大,直接修改字段会因耗时过久触发504。可拆分步骤执行:-- 新增临时字段 ALTER TABLE table ADD COLUMN time_upd_temp INT NOT NULL DEFAULT UNIX_TIMESTAMP(); -- 迁移现有数据(按需执行) UPDATE table SET time_upd_temp = time_upd; -- 替换原字段 ALTER TABLE table DROP COLUMN time_upd, CHANGE COLUMN time_upd_temp time_upd INT NOT NULL DEFAULT UNIX_TIMESTAMP();临时调整超时参数
增大锁等待超时时间,避免操作因耗时过长被中断:SET GLOBAL innodb_lock_wait_timeout = 300; -- 设为300秒,可根据实际情况调整操作完成后建议改回原参数。
内容的提问来源于stack exchange,提问作者Дмитрий Варзанов
相关产品推荐
相关产品推荐

