MySQL错误#1067 'UpdatedAt'的默认值无效。
MySQL错误#1067 'UpdatedAt'的默认值无效。
我从备份中恢复了MySQL数据库,但是我注意到编码字符被设置为latin1_swedish_ci,我无法将其更改为utf8_unicode_ci,因为我在标题中遇到了错误。有什么建议吗?下面是show create table players;的输出和select version();的结果:8.0.18
CREATE TABLE `players` ( `Id` mediumint(9) NOT NULL AUTO_INCREMENT, `Login` varchar(50) NOT NULL DEFAULT '', `Game` varchar(3) NOT NULL DEFAULT '', `NickName` varchar(100) NOT NULL DEFAULT '', `Nation` varchar(3) NOT NULL DEFAULT '', `UpdatedAt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `Wins` mediumint(9) NOT NULL DEFAULT '0', `TimePlayed` int(10) unsigned NOT NULL DEFAULT '0', `TeamName` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`Id`), UNIQUE KEY `Login` (`Login`), KEY `Game` (`Game`), KEY `Nation` (`Nation`), KEY `Wins` (`Wins`), KEY `UpdatedAt` (`UpdatedAt`) ) ENGINE=MyISAM AUTO_INCREMENT=1014 DEFAULT CHARSET=latin1
原因:在新服务器上,设置了NO_ZERO_DATE sql模式,该模式不允许使用该默认值。
解决方法:可以在当前会话中移除该设置,使用以下代码:
set session sql_mode=replace(@_mode,'NO_ZERO_DATE','');
但是你可能希望在配置文件中设置sql_mode,以便将其应用于所有会话并在重启后保持。你可能会执行其他查询,而新的sql_mode默认值可能不允许这些查询,因此你应该检查其他新的默认值;特别是,可能会出现ONLY_FULL_GROUP_BY和STRICT_TRANS_TABLES的问题。
我使用了set session sql_mode=replace(@_mode,'NO_ZERO_DATE','');命令,并尝试将字符集更改为urf8,但仍然出现相同的错误。
在同一个会话中吗?
那么你肯定做错了什么;请参考dbfiddle.uk/…。
MySQL错误#1067无效的默认值'UpdatedAt'的原因可能是MySQL的日期限制。解决方法是通过以下步骤进行操作:
1. 查看当前变量值:show variables like 'sql_mode';
2. 确认之前命令的结果:
+---------------+-----------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------+
| sql_mode | NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------+
3. 临时删除日期限制:set sql_mode='NO_ENGINE_SUBSTITUTION';
4. 执行所有需要的命令,如INSERT/UPDATE/CREATE等。
5. 完成后将sql_mode恢复为之前的值:set sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION';
通过以上步骤,可以解决MySQL错误#1067无效的默认值'UpdatedAt'问题。