【发布时间】:2015-10-28 15:27:52
【问题描述】:
我做了一个 mysql 5.5 数据库的转储并将其加载到 5.6 服务器中。
转储将 ON 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 没有完美地模仿这种模式下的旧行为,或者旧服务器从来没有做我认为它正在做的事情。我不确定是哪个。
【问题讨论】: