MariaDB时间戳未更新日期

时间:2019-01-17 10:58:48

标签: mysql mariadb

我刚刚在表中添加了一个时间戳字段

我需要在不向每个查询添加说明的情况下保存最近更新的字段

 `lastupd` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

问题在于所有字段都具有0000-00-00 00:00:00,并且在查询更新timestamp时未更新

我在5.5.60-MariaDB-MariaDB服务器上并使用MyISAM

1 个答案:

答案 0 :(得分:0)

(如果我没记错的话)在该旧版本中,这样的DEFAULT只能应用于表中的 first TIMESTAMP。请提供SHOW CREATE TABLE

请考虑切换到InnoDB。

在5.6.6更改日志中:

  

在MySQL中,TIMESTAMP数据类型在非标准方式上与其他数据类型不同:

     未使用NULL属性明确声明的

TIMESTAMP列被分配了NOT NULL属性。 (其他数据类型的列,如果未明确声明为NOT NULL,则允许NULL值。)将此列设置为NULL会将其设置为当前时间戳。

     

如果未使用NULL属性或显式DEFAULT或ON UPDATE子句声明表中的第一TIMESTAMP列,则会自动为其分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。

     如果未使用NULL属性或显式DEFAULT子句声明,则第一列之后的

TIMESTAMP列将自动分配为DEFAULT'0000-00-00 00:00:00'(“零”时间戳记) 。对于没有为该列指定显式值的插入行,该列被分配为“ 0000-00-00 00:00:00”,并且不会发生警告。

     

这些非标准行为仍然是TIMESTAMP的默认行为,但现在已被弃用,并且此警告会在启动时出现:

     

[警告]不建议使用带隐含DEFAULT值的TIMESTAMP。   请使用--explicit_defaults_for_timestamp服务器选项(请参见   文档以获取更多详细信息。

     

如警告所示,要关闭非标准行为,请在服务器启动时启用新的explicit_defaults_for_timestamp系统变量。启用此变量后,服务器将按以下方式处理TIMESTAMP

     未显式声明为NOT NULL的

TIMESTAMP列允许NULL值。将此类列设置为NULL会将其设置为NULL,而不是当前时间戳。

     

没有为TIMESTAMP列自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。这些属性必须明确指定。

     声明为NOT NULL且没有显式DEFAULT子句的

TIMESTAMP列被视为没有默认值。对于没有为该列指定显式值的插入行,结果取决于SQL模式。如果启用了严格的SQL模式,则会发生错误。如果未启用严格的SQL模式,则为该列分配隐式默认值'0000-00-00 00:00:00',并出现警告。这类似于MySQL处理其他时间类型(例如DATETIME)的方式。