mysql on update currenttimestamp_关于mysql:如何从现有列中删除ON UPDATE CURRENT_TIMESTAMP?...

我对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命令的解释?启用它会以某种方式帮助我修复损坏的列吗?

更新:

这里有一个类似的问题,但是那是关于创建新表,而不是更改现有列。实际上,这个问题是我在5.5服务器上创建表时用作指导的问题。我使用了两步过程:使用默认0创建以禁止ON UPDATE CURRENT_TIMESTAMP,然后删除默认值。

如果没有explicit_defaults_for_timest,两步过程肯定无法在5.6服务器上产生正确的结果,这表明5.6不能完全模仿这种模式下的旧行为,或者旧服务器从不执行我认为的工作。我不

使用其他答案中的想法,以及几个新安装的mysql服务器实例,我对三种不同服务器配置上几个不同的CREATE和ALTER命令的行为进行了比较:

MySQL的5.5.45

mysql.5.6.26没有explicit_defaults_for_timestamp

MySQL的5.6.26与explicit_defaults_for_timestamp

最简单的解释是带有explicit_defaults_for_timestamp的5.6。一切都很理智。时间戳类型与任何其他类型都没有明显不同。在打开explicit_defaults_for_timestamp标志之前创建的列将保留其旧的默认值和魔术更新。

在5.5中,隐式默认值是在创建时间戳列(如果它是表中的第一个时间戳列)时发生的。这些已经有据可查了。可以通过设置显式默认值来避免魔术更新行为,然后可以删除默认值,并为列保留3个所需的属性:不可为空,无默认值,无魔术更新。这是CREATE TABLE t (TIMESTAMP c NOT NULL DEFAULT 0)和ALTER TABLE t ALTER COLUMN c DROP DEFAULT的结果。

不能使用单个CREATE TABLE命令来重新创建此状态,并且该状态不能在mysqldump中生存。

5.6没有explicit_defaults_for_timestamp是最有趣的情况。它与5.5几乎相同,但是DROP DEFAULT命令不同。如果您尝试"使用默认0创建然后丢弃默认值创建"序列,则魔术更新属性将显示为丢弃的副作用。但是,如果您将默认的CURRENT_TIMESTAMP设置为0,则DROP DEFAULT可以正常工作而不会产生副作用。 (必须是一个错误。我无法想象它会故意这样表现的任何原因。)

因此,这对命令在我测试的所有服务器配置上都将具有相同的结果:

该列现在没有默认值,也没有任何魔术更新。

接受你的答案! (很荣幸与10k用户遇到相同的问题:D)

我相信这将重置并使ON UPDATE无效。这将有效地做出以下定义:

更改为此:

如果您想完全重置该列,则应该可以像下面这样简单地重新定义它:

ALTER TABLE mytable

CHANGE mycolumn

mycolumn TIMESTAMP NOT NULL;

我需要一种无需添加默认值的方法。您的建议会创建一个默认值,然后如果我删除默认值,则会自动返回auto-update属性。

请参阅第二个alter语句。修改列而不指定默认值。

这带来了所有"隐藏的默认"行为-CURRENT_TIMESTAMP作为插入和自动更新的默认行为。也许与explicit_defaults_for_timestamp一起工作。但是,由于我发现我无法重新启动服务器就无法设置该选项,因此我无法立即对其进行测试。

实际上,在第二次尝试时,您的第一个建议后跟ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT似乎有效。我仍在尝试弄清楚为什么这种精确的组合有效而其他类似的组合却无效。

仍然没有道理,但是我已经收集了足够的信息来描述(如果不解释的话)这种行为。作为幸运的副作用,我也解决了我原来的问题。我将结果发布为自我解答,但是我为您指出正确的方向而给予我荣誉。

如果要同时删除DEFAULT值和ON UPDATE值,则以下内容无济于事

ALTER TABLE `your_table` CHANGE `your_column` `your_column` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00';

对于您的用例,我认为DATETIME会更好地为您服务,例如:

插入时默认为NOW(),但更新后不受影响。

请参见以下问题,以更好地解释两者之间的区别:

我应该使用字段日期时间还是时间戳?

尝试启用explicit_defaults_for_timestamp系统变量,然后使用以下命令重新定义列:

如果我正确理解文档,则必须启用explicit_defaults_for_timestamp才能定义声明为NOT NULL的TIMESTAMP列,而无需显式的DEFAULT。

我怀疑你是对的。我希望文档对现有列上的选项效果更加清楚,以便我对打开它更有信心。跳水...和set @@explicit_defaults_for_timestamp=1没有用。只读变量。我想这意味着它需要重新启动服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值