在 Laravel 9、MySQL 8.0 中设置 datetime 的默认值为 ‘0000-00-00 00:00:00’ 时报错:SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for ‘operated_at_gmt’

1、在 MySQL 8.0 中设置 datetime 的默认值为 ‘0000-00-00 00:00:00’ 时报错:SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for ‘operated_at_gmt’。如图1

图1

2、参考:https://www.shuijingwanwq.com/2022/09/28/6993/ 在 Navicat for MySQL 中,将表从一个数据库复制至另一个数据库时,报错:[ERR] 1292 – Incorrect datetime value: ‘0000-00-00 00:00:00’ for column ‘created_at_gmt’ at row 1(在 MySQL 8.0 中)。

3、现在需要永久设置 SQL 模式。参考:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html 5.1.11 Server SQL Modes

4、编辑 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini ,搜索:sql-mode,删除掉:NO_ZERO_IN_DATE,NO_ZERO_DATE,保留下其他的

# sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

5、重启电脑后,重新执行相应 SQL,仍然报错。但是在数据库修改一条记录的 datetime 的值为 ‘0000-00-00 00:00:00’,可修改成功。如图2

图2

6、复制报错的 SQL,在数据库中手动执行成功。如图3

图3

7、参考:https://stackoverflow.com/questions/18067614/how-can-i-set-the-default-value-of-a-timestamp-column-to-the-current-timestamp-w 。调整迁移文件,放弃设置默认值:’0000-00-00 00:00:00′ 。如图4

图4

// $table->dateTime(‘operated_at_gmt’)->default(‘0000-00-00 00:00:00’)->comment(‘操作时间’)->index();

$table->dateTime(‘operated_at_gmt’)->comment(‘操作时间’)->index();

永夜