问题描述
修改RDS MySQL的TIMESTAMP
字段,或者创建表时TIMESTAMP
字段出现如下错误。但是相同表结构,却在本地自建数据库中可以执行成功。
ERROR 1067 (42000): Invalid default value for 'xxx' ,
问题原因
该报错与MySQL的explicit_defaults_for_timestamp
参数值有关。在RDS MySQL中该参数默认值为OFF
,而在社区MySQL版本中默认值为ON
。explicit_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修改参数配置的方法,请参见设置实例参数。
文档内容是否对您有帮助?