RDS MySQL出现“ERROR 1067 (42000): Invalid default value for 'xxx'”报错

问题描述

修改RDS MySQL的TIMESTAMP字段,或者创建表时TIMESTAMP字段出现如下错误。但是相同表结构,却在本地自建数据库中可以执行成功。

ERROR 1067 (42000): Invalid default value for 'xxx' ,

问题原因

该报错与MySQL的explicit_defaults_for_timestamp参数值有关。在RDS MySQL中该参数默认值为OFF,而在社区MySQL版本中默认值为ONexplicit_defaults_for_timestamp参数控制着TIMESTAMP类型字段的默认行为,其中:

  • 当参数值为OFF时,TIMESTAMP类型字段不允许设置非法值。例如不允许设置为NULL或者"0000-00-00 00:00:00.000000"

  • 当参数值为ON时,TIMESTAMP类型字段允许设置非法值。例如允许设置为NULL或者"0000-00-00 00:00:00.000000"

说明

explicit_defaults_for_timestamp更多详情,请参见MySQL官方文档

解决方案

  • 方案一:针对数据库实例级别的全局参数设置

    您可前往RDS控制台进行参数配置,将explicit_defaults_for_timestamp参数设置为ON。设置后所有连接到该RDS实例的会话默认永久会使用明确的时间戳默认值行为。

  • 方案二:针对单个会话进行的临时设置

    您可以在会话中设置set explicit_defaults_for_timestamp=ON也可以生效。该方式仅对当前会话有效,当会话结束或断开连接后,该设置就会失效。

相关文档

通过RDS控制台或API修改参数配置的方法,请参见设置实例参数