MySQL新增TIMESTAMP字段默认值对已有行不生效问题咨询
为什么MySQL 5.1.61中新增TIMESTAMP字段的默认值对已有行不生效?
这个问题其实是MySQL 5.1版本的典型行为特性,我来给你拆解清楚:
MySQL 5.1的默认填充逻辑:在5.1(及更早版本)中,当你通过
ALTER TABLE添加带DEFAULT CURRENT_TIMESTAMP的NOT NULL TIMESTAMP列时,系统不会自动将已有行的该列填充为默认值。取而代之的是用TIMESTAMP类型的"零值"——0000-00-00 00:00:00——来填充已有行的新字段。这种设计的初衷是避免大量数据全表更新带来的性能开销(比如锁表、IO负载),尤其针对大表场景。新版本的行为差异:后续的MySQL版本(比如5.5及之后)调整了这个逻辑,添加带DEFAULT约束的NOT NULL列时,会自动用DEFAULT值填充所有已有行。但你使用的5.1.61属于较老版本,还没有这个优化。
让已有行应用默认值的方法:如果想要让10K条已有数据的ts字段都设置为当前时间,可以执行这条更新语句:
UPDATE test SET ts = CURRENT_TIMESTAMP;你的数据量不大,这个操作会很快完成;如果是超大表,建议分批次执行来减少锁表影响。
另外要说明的是,你设置的ON UPDATE CURRENT_TIMESTAMP仅针对更新操作,DEFAULT CURRENT_TIMESTAMP针对新增操作,这两部分逻辑是正常生效的——只有添加新字段时的已有行填充,受限于5.1版本特性才会出现零值情况。
内容的提问来源于stack exchange,提问作者Al-Alamin
相关产品推荐
相关产品推荐

