我做了一个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 workbench中的"Clear default"选项,它与它应该做的相反 - 它给了列一个默认值!
我能够摆脱默认值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_timestamp,两步程序肯定不会在5.6服务器上产生正确的结果; 这是一个标志,5.6无法完美地模仿这种模式下的旧行为,或旧服务器从未做过我认为它正在做的事情.我不能确定哪个.
小智 19
使用其他答案中的想法,以及一些新安装的mysql服务器实例,我已经在3种不同的服务器配置上比较了几种不同的CREATE和ALTER命令的行为:
最简单的解释是5.6 with explicit_defaults_for_timestamp.一切都很清醒.时间戳类型与任何其他类型没有明显不同.在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可以在没有副作用的情况下工作.(必须是一个错误.我无法想象它会故意以这种方式行事.)
因此,这对命令在我测试的所有服务器配置上都会有相同的结果:
ALTER TABLE t CHANGE COLUMN c c TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE t ALTER COLUMN c DROP DEFAULT;
Run Code Online (Sandbox Code Playgroud)
该列现在没有默认值,也没有魔术更新.
Bra*_*tie 15
ALTER TABLE mytable
CHANGE mycolumn
mycolumn TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
我相信这会重置并使之无效ON UPDATE
.这将有效地定义:
CREATE TABLE mytable (
# Other Columns
mycolumn timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
)
Run Code Online (Sandbox Code Playgroud)
换成这个:
CREATE TABLE mytable (
# Other Columns
mycolumn timestamp NOT NULL default CURRENT_TIMESTAMP
)
Run Code Online (Sandbox Code Playgroud)
如果您想完全重置列,您应该可以简单地重新定义它,如:
ALTER TABLE mytable
CHANGE mycolumn
mycolumn TIMESTAMP NOT NULL;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10569 次 |
最近记录: |