最近在使用MySql数据库的时候,用了timestamp类型,没有指定默认类型。发现在使用MyBatis操作数据库的时候,有一个字段的值为null确被修改了。调试程序,最终发现:原来MySql这里有坑,原始建表语句如下:
create table if not exists rep_reconciliation_task(
task_id varchar(32) comment '任务ID',
rec_code varchar(50) comment '对账类型',
start_time timestamp comment '批量启动时间',
actual_start_time timestamp comment '实际启动时间',
end_time timestamp comment '批量结束时间',
warn_time varchar(20) comment '批量告警时间',
rec_sql varchar(10000) comment '对账逻辑SQL',
rec_date char(8) comment '对账日期',
update_time timestamp comment '更新时间',
task_status char(1) comment '状态:I-初始化,W-批量等待前置任务中,P-批量运行中,S-成功,F-批量失败',
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='对账任务表';
建表后结果如下:
| rep_reconciliation_task | CREATE TABLE `rep_reconciliation_task` (
`task_id` varchar(32) NOT NULL DEFAULT '' COMMENT '任务ID',
`rec_code` varchar(50) DEFAULT NULL COMMENT '对账类型',
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '批量启动时间',
`actual_start_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '实际启动时间',
`end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '批量结束时间',
`warn_time` varchar(20) DEFAULT NULL COMMENT '批量告警时间',
`rec_sql` varchar(10000) DEFAULT NULL COMMENT '对账逻辑SQL',
`rec_date` char(8) DEFAULT NULL COMMENT '对账日期',
`update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
`task_status` char(1) DEFAULT NULL COMMENT '状态:I-初始化,W-批量等待前置任务中,P-批量运行中,S-成功,F-批量失败',
PRIMARY KEY (`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='对账任务表'
该表里面有start_time、acual_start_time、end_time ,updatetime 4个timestamp类型,都是默认创建的,最后MySql解析的结果,却只给start_time加上了 default_current_timestamp on update current_timestamp。和DBA交流过,估摸着应该是MySql内核的bug。
解决办法其实很简单,指定一个默认值就OK了:NOT NULL DEFAULT '0000-00-00 00:00:00' comment '批量启动时间'