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 吗?
  • 现在怎么解决线上的这个问题呢?
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

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

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

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!