Laravel在migrate出现Syntax error or access violation: 1067 Invalid default value

本文详细记录了解决Laravel项目中迁移时遇到的错误过程,通过调整MySQL配置和使用DB::raw()方法,成功解决了关于默认时间戳值的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发Laravel项目的时候,migrate的时候出现离奇错误。
错误完整内容如下:

Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'expiry_date_end' (SQL: create table `app_membership_card_user` (`id` int unsigned not null auto_increment primary key comment '记录自增ID', `user_id` int not null comment '用户ID', `kind_id` int not null comment '会员卡种类ID', `expiry_date_start` timestamp not null comment '有效期的起始日期', `expiry_date_end` timestamp not null comment '有效期的截止日期', `money` double not null comment '会员卡的实际办理金额', `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

  at /Users/icemoon/Projects/laravel-wash-car/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'expiry_date_end'")
      /Users/icemoon/Projects/laravel-wash-car/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

  2   PDOStatement::execute()
      /Users/icemoon/Projects/laravel-wash-car/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

  Please use the argument -v to see more details.

开发平台:
Macbook PRO 13
MySQL:5.7.24
PHP:7.2.14
平台软件都是用brew安装的。

migration的代码如下:

public function up()
    {
        Schema::create('app_membership_card_user', function (Blueprint $table) {
            $table->increments('id')->comment('记录自增ID');
            $table->integer('user_id')->unique()->comment('用户ID');
            $table->integer('kind_id')->unique()->comment('会员卡种类ID');
            $table->timestamp('expiry_date_start')->comment('有效期的起始日期');
            $table->timestamp('expiry_date_end')->comment('有效期的截止日期');
            $table->double('money')->unique()->comment('会员卡的实际办理金额');
            $table->timestamps();
        });
    }

初步判断错误原因是由于expiry_date_end来的,在migration删除对应行内容后,执行php artisan migrate好使,但字段不能删。在搜索引擎查了半天,应该是MySQL的设置的问题。

连接本地数据库,执行

select @@sql_mode

查看结果是如下一串

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

其中加粗的NO_ZERO_DATE是要删掉的字段,这个字段导致数据里的时间戳不能为0000-0-0 00:00:00的形式,资料上说删除这个字段应该可以结局问题。
按着教程中做,执行如下语句:

set @@sql_mode=‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’

执行完语句,重启MySQL服务,结果没什么卵用,似乎这种改法改不掉这个字段,继续找资料,查到个方法是改配置文件my.ini,资料中说mac osx的中的MySQL的配置文件不存在,但是我找了半天,竟然找到了。

我的MySQL的配置文件路径在 /usr/local/etc/my.cnf

我的配置文件中的内容如下:

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1

我直接在配置文件中加入如下内容,直接放空自己,本地开发环境。

#sql-mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
sql-mode=

再次重启MySQL服务,执行

select @@sql-mode

返回结果内容为空了,尝试migrate,依然是如上错误。把Laravel生成的SQL语句复制粘贴到数据库中可以完美执行,说明还是自己Laravel项目的问题。

哎,鄙视下自己,早没想到粘贴语句到数据库中…
后来在参考[1]中看到了default(DB::raw('CURRENT_TIMESTAMP')) 的代码,粘贴过来试试,问题解决了。

最终解决办法:
$table->timestamp('expiry_date_end')->comment('有效期的截止日期')->default(DB::raw('CURRENT_TIMESTAMP'))
总结:
laravel应该有自己的timestamp的0校验,具体位置没找到,经过此次问题,对MySQL的配置又更加熟悉一步,检索问题的能力也有所提高。

参考:
[1]:https://github.com/laravel/framework/issues/3602
[2]:http://www.cnblogs.com/imor/p/7199240.html
[3]:https://blog.csdn.net/wyzxg/article/details/8787878

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值