如何在MySQL中禁用所有DateTime类型列的UPDATE_CURRENT_TIMESTAMP?
批量禁用所有表中DateTime列的UPDATE_CURRENT_TIMESTAMP功能
完全懂这种被MySQL默认设置坑到的感觉!默认给DateTime列开启UPDATE_CURRENT_TIMESTAMP确实挺无语的,尤其是要批量修改的时候,手动改每个表每个列根本不现实。下面给你两种实用的批量处理方法:
方法1:生成ALTER语句手动执行
先通过查询自动生成所有需要修改的ALTER TABLE语句,然后批量执行即可:
SELECT CONCAT( 'ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, ') ', IF(IS_NULLABLE = 'YES', 'NULL', 'NOT NULL'), IF(COLUMN_DEFAULT IS NOT NULL, CONCAT(' DEFAULT ', COLUMN_DEFAULT), ''), ';' ) AS alter_statement FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_database_name' -- 替换成你的目标数据库名 AND DATA_TYPE = 'datetime' AND COLUMN_TYPE LIKE '%ON UPDATE CURRENT_TIMESTAMP%';
执行这个查询后,会得到一堆针对目标列的ALTER语句,把这些语句复制出来批量执行,就能去掉对应列的ON UPDATE CURRENT_TIMESTAMP自动更新属性。
方法2:用存储过程自动批量修改
如果你的数据库里表和符合条件的列特别多,可以用存储过程自动遍历修改,省去手动复制语句的麻烦:
DELIMITER // CREATE PROCEDURE DisableAllUpdateCurrentTimestamp() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tbl_schema, tbl_name, col_name, col_type, col_default, col_nullable VARCHAR(255); DECLARE cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONCAT(DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, ')'), COLUMN_DEFAULT, IS_NULLABLE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_database_name' -- 替换成你的目标数据库名 AND DATA_TYPE = 'datetime' AND COLUMN_TYPE LIKE '%ON UPDATE CURRENT_TIMESTAMP%'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO tbl_schema, tbl_name, col_name, col_type, col_default, col_nullable; IF done THEN LEAVE read_loop; END IF; SET @alter_sql = CONCAT( 'ALTER TABLE `', tbl_schema, '`.`', tbl_name, '` MODIFY COLUMN `', col_name, '` ', col_type, ' ', IF(col_nullable = 'YES', 'NULL', 'NOT NULL'), IF(col_default IS NOT NULL, CONCAT(' DEFAULT ', col_default), '') ); PREPARE stmt FROM @alter_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE cur; END // DELIMITER ; -- 调用存储过程执行批量修改 CALL DisableAllUpdateCurrentTimestamp();
执行完存储过程后,所有带ON UPDATE CURRENT_TIMESTAMP属性的DateTime列都会被自动修改,去掉这个容易踩坑的默认功能。
确实搞不懂MySQL为啥不把这个功能做成可选配置,默认开启真的容易在不知情的情况下导致数据被自动更新,踩过坑的人都懂😅
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

