【问题标题】:Timestamp in mysql columnmysql列中的时间戳
【发布时间】:2015-12-18 15:28:48
【问题描述】:

我正在将数据库上传到 MySQL 并遇到此问题:

ERROR 1293 (HY000) at line 31:不正确的表定义;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列

问题在于该表中有两列具有“Timestamp”数据类型,只有一个应该具有“Current Timestamp”值,而另一个默认值为“null”。当我上传数据库时,两列的值都更改为“当前时间戳”,这使得导出和导入的过程非常烦人,因为我必须在再次导入之前手动将其更改回 null。

知道为什么它会自动更改为“当前时间戳”吗?这是一个 Amazon EC2 linux 实例(见附件 mysql 版本)

【问题讨论】:

  • 当我上传数据库时,两列的值都变为“当前时间戳” 这没有意义。当您“上传”数据库时,它们会发生变化是什么意思?是否涉及多台服务器?如果您希望时间戳不是自动的,则需要将其声明为 TIMESTAMP NULL DEFAULT NULL(而不是 TIMESTAMP DEFAULT NULL),但目前尚不清楚您在问什么。
  • 感谢您的回答@Michael-sqlbot ....对不起,我不清楚...我有两列设置为 TIMESTAMP,只有一列将 CURRENT_TIMESTAMP 作为默认值。当我导入数据库时​​(我在两个单独的服务器中复制了它),我得到了错误,即使其中一个默认为空...这里是列:creationDatetimetimestamp NOT NULL,lastModificationtimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ...错误是:#1293 - 表定义不正确;在 DEFAULT 或 ON UPDATE 子句中只能有一个带有 CURRENT_TIMESTAMP 的 TIMESTAMP 列

标签: mysql linux amazon-ec2 timestamp


【解决方案1】:

在 5.6 版之前,MySQL 在您声明时间戳列时会做出一个假设...具体来说,它假设表上的 first 时间戳列将是具有自动更新属性的列。

如果您没有显式禁用第一个时间戳上的行为,则会隐式启用它,这会导致稍后时间戳上的显式自动值被拒绝。不问是不够的。

它不必是自动初始化或更新为当前时间戳的表中的第一个TIMESTAMP 列。但是,要为不同的TIMESTAMP 列指定自动初始化或更新,您必须取消第一个列的自动属性。然后,对于另一个 TIMESTAMP 列,DEFAULTON UPDATE 子句的规则与第一个 TIMESTAMP 列的规则相同,除了如果省略这两个子句,则不会发生自动初始化或更新。

要禁止第一个 TIMESTAMP 列的自动属性,请执行以下任一操作:

使用指定常量默认值的DEFAULT 子句定义列。

指定NULL 属性。这也会导致列允许NULL 值,这意味着您无法通过将列设置为NULL 来分配当前时间戳。分配NULL 会将列设置为NULL

——https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html

因此,对于您的第一个时间戳 - 如果它不是您想要成为自动时间戳的那个 - 使用这些列类型声明中的任何一个(它们是相同的):

TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'
TIMESTAMP NOT NULL DEFAULT 0 -- automatically expanded to '0000-00-00 00:00:00'

这应该允许您在系统之间复制此表定义而不会出现问题。


这个愚蠢的问题在 MySQL Server 5.6 中得到了修复,其中系统变量 explicit_defaults_for_timestamp 禁用了表中第一个时间戳的隐式自动行为。

如果您在未设置此选项的情况下启动运行 5.6 的服务器,则会将警告写入错误日志。

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please 
use --explicit_defaults_for_timestamp server option (see documentation 
for more details).

警告提醒您,您仍有旧行为,该行为已在 5.6 中弃用。

【讨论】:

  • 完美@Michael-sqlbot ...我有2个时间戳,第一个默认为NULL值,第二个默认为CURRENT TIMESTAMP...我只是颠倒了两者的顺序并且工作得很好...谢谢!!
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多