我刚刚在表中添加了一个时间戳字段
我需要在不向每个查询添加说明的情况下保存最近更新的字段
`lastupd` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
问题在于所有字段都具有0000-00-00 00:00:00
,并且在查询更新timestamp
时未更新
我在5.5.60-MariaDB
-MariaDB服务器上并使用MyISAM
表
答案 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)的方式。