Laravel - SQLSTATE[42000]:语法错误或访问冲突:1067迁移中“active”的默认值无效

fivyi3re  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(157)

在我的Laravel-8应用程序中,我使用迁移创建了用户表。我想添加两个新列。我有:

class AlterTableUsers extends Migration
{
    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('avatar', 200)->after('password')->nullable();
            $table->tinyInteger('active', 1)->after('avatar')->nullable()->default(0);
        });
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('avatar', 200)->after('password')->nullable();
            $table->tinyInteger('active', 1)->after('avatar')->nullable()->default(0);
        });
    }

当我这样做的时候:

php artisan migrate

我得到了这个错误:
SQLSTATE[42000]:语法错误或访问冲突:1067“active”的默认值无效(SQL:alter table users add avatar varchar(200)null after password,add active tinyint null default '0' auto_increment primary key after avatar
1 C:\xampp\htdocs\myapp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:465 PDOException::(“SQLSTATE[42000]:语法错误或访问冲突:1067“active”的默认值无效“)
2 C:\xampp\htdocs\myapp\vendor\laravel\framework\src\Illuminate\Database\Connection.php:465 PDO::prepare(“alter table users add avatar varchar(200)null after password,add active tinyint null default '0' auto_increment primary key after avatar“)
我该如何解决?
谢谢

pprl5pva

pprl5pva1#

你有两个错误。在你的down函数中,你必须删除你的列。

public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('avatar');
            $table->dropColumn('active');
        });
    }

你的问题是这一行:

$table->tinyInteger('active', 1)->after('avatar')->nullable()->default(0);

当您将1放入tinyInteger字段时,您将创建一个为null的auto_increment primary key值,并且具有默认值。这就是此处出现的错误:
SQLSTATE[42000]:语法错误或访问冲突:1067“active”的默认值无效(SQL:alter table users add avatar varchar(200)null after password,add active tinyint null default '0' auto_increment primary key after avatar)
您真的需要active字段为auto_increment还是它只是一个tinyInteger?如果您将该行更改为:

$table->tinyInteger('active')->after('avatar')->nullable()->default(0);

很有效。如果你这样写:

$table->tinyIncrements('active')->after('avatar');

你会得到这个错误:
表定义不正确;只能有一个auto列,并且必须将其定义为键
因为users表已经有id

sz81bmfz

sz81bmfz2#

如果您使用的是sqlite,它只支持每个事务修改一(1)个表,则可能会发生这种情况。

yvt65v4c

yvt65v4c3#

如果你使用nullable,那就很好地解决了默认值,而默认值不是必需的。

$table->tinyInteger('active', 1)->after('avatar')->nullable()->default(0);

删除向上和向下功能中的默认值

相关问题