我做了一个
mysql 5.5数据库的转储并将其加载到5.6服务器.
转储将UPDATE CURRENT_TIMESTAMP添加到之前没有它的一堆列中.
我正在搜索ALTER TABLE语句,该语句将删除ON UPDATE CURRENT_TIMESTAMP规则而不进行任何其他更改.在我的想象中它应该是ON UPDATE NOOP或ON UPDATE NO_CURRENT_TIMESTAMP.
ON UPDATE JUST_BE_A_NORMAL_COLUMN?
我尝试在mysql工作台中使用“清除默认”选项,它与它应该做的相反 – 它给了列一个默认值!
我能够通过ALTER TABLE t ALTER COLUMN c DROP DEFAULT摆脱默认值,因此INSERT中的列是强制性的(就像它在转储/重新加载之前一样,正如我所希望的那样)但UPDATE上的不需要的行为仍然存在.
我没有启用explicit_defaults_for_timestamp选项.如果我刚刚开始新的我肯定会使用那个选项,因为它似乎更加理智.但是因为我已经在5.5中按照我想要的方式配置了列,所以我希望它们在转移到5.6时保持相同的语义.显然mysqldump还不够聪明.
此时我不确定我是否理解启用explicit_defaults_for_timestamp会产生什么影响.该选项是否会更改现有表的行为,还是仅更改对未来CREATE TABLE命令的解释?将它打开以某种方式帮我修复破碎的列?
更新:
类似的问题是here但是那个是关于创建一个新表而不是改变现有列.实际上,这个问题是我在5.5服务器上创建表时用作指南的问题.我使用了两步过程:使用默认值0创建以禁止ON UPDATE CURRENT_TIMESTAMP,然后删除默认值.
如果没有explicit_defaults_for_timestamp,两步程序肯定不会在5.6服务器上产生正确的结果;这是一个标志,5.6无法完美地模仿这种模式下的旧行为,或旧服务器从未做过我认为它正在做的事情.我不能确定哪个.