SQLite 报错 Cannot add a NOT NULL column with default value NULL

我需要给 Laravel 默认的 users 加几个字段:

public function up()
{
  Schema::table('users', function (Blueprint $table) {
      $table->string('phone')->unique()->comment('电话');
      $table->string('company_name')->nullable()->comment('公司名称');
      $table->string('company_title')->nullable()->comment('公司职位');
      $table->string('recommender_phone')->nullable()->comment('推荐人手机号');
 });}

在本地 php artisan migrate 成功了,但是在服务器上却报错了:

xcy@iZuf6bmn9ma9a7kv0cbvwtZ:/var/www/example.com$ php artisan migrate
                                                                                                              APPLICATION IN PRODUCTION.
  Do you really wish to run this command? (yes/no) [no]
❯ yes

   INFO  Running migrations.

  2022_09_26_121246_add_fields_to_users_table ............................................................................................. 2ms FAIL

In Connection.php line 759:

  SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL (SQL: alter table "users" add column "phone" varchar not null)


In Connection.php line 538:

  SQLSTATE[HY000]: General error: 1 Cannot add a NOT NULL column with default value NULL

我在本地和服务器上都用的是 SQLite,本地用的是 3.38.5,线上用的是 3.31.1:

# 本地
➜  php -i | grep -i sqlite
PDO drivers => dblib, mysql, odbc, pgsql, sqlite
pdo_sqlite
PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.38.5
sqlite3
SQLite3 support => enabled
SQLite Library => 3.38.5
sqlite3.defensive => On => On
sqlite3.extension_dir => no value => no value


# 线上
xcy@iZuf6bmn9ma9a7kv0cbvwtZ:/var/www/example.com$ php -i | grep -i sqlite
/etc/php/8.1/cli/conf.d/20-pdo_sqlite.ini,
/etc/php/8.1/cli/conf.d/20-sqlite3.ini,
PDO drivers => sqlite
pdo_sqlite
PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.31.1
sqlite3
SQLite3 support => enabled
SQLite Library => 3.31.1
sqlite3.defensive => On => On
sqlite3.extension_dir => no value => no valu

我的问题是:

  • 这是我代码的问题,还是 SQLite 的 Bug?
  • 较新版本的 SQLite 修复了上面的 Bug 吗?
  • 现在怎么解决线上的这个问题呢?
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1

参考网上答案,用了这样一个 work-around,不报错了,但是看起来不大对头,电话号码在 Laravel 代码里有专门的 validation 规则

-            $table->string('phone')->unique()->comment('电话');
+            $table->string('phone')->unique()->comment('电话')->default('');
2年前 评论