Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增

Posted

技术标签:

【中文标题】Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增【英文标题】:Laravel migration - how to change the `id` field to be primary and auto-incrementing later 【发布时间】:2017-12-07 18:47:06 【问题描述】:

我的表“sales_order_details”的 id 字段为整数“int(10)”,默认值为 0。我需要将其更改为迁移中的主要自动增量键。

我尝试了以下方式:

 public function up()
    
        Schema::table('sales_order_details', function (Blueprint $table)

         $table->integer('id')->default(NULL)->change();
         $table->increments('id')->change();

       );
    

  public function down()
    
        Schema::table('sales_order_details', function (Blueprint $table)
        $table->dropPrimary('id')->change();

       );
    

我收到以下错误:

[照亮\数据库\查询异常] SQLSTATE [42000]:语法错误或访问冲突:1075 表定义不正确 启动;只能有一个自动列,并且必须将其定义为键 (SQL: ALTER TABLE sales_order_details CHANGE id id INT UNSIGNED AUTO_INCREM ENT 非空)

[Doctrine\DBAL\Driver\PDOException] SQLSTATE [42000]:语法错误或访问冲突:1075 表定义不正确 启动;只能有一个自动列,并且必须定义为一个键

[PDO异常] SQLSTATE [42000]:语法错误或访问冲突:1075 表定义不正确 启动;只能有一个自动列,并且必须定义为一个键

如何正确进行迁移?我使用的是 5.4 版

【问题讨论】:

为什么要写这两行 $table->integer('id')->default(NULL)->change(); $table->increments('id')->change();增量只需要第二个。 defaultincrements 一起使用不会出问题吗? 【参考方案1】:

你可以这样试试

  public function up()
    
        DB::statement("ALTER TABLE sales_order_details MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT");            
    

  public function down()
    
        DB::statement("ALTER TABLE sales_order_details MODIFY id INT NOT NULL");
        DB::statement("ALTER TABLE sales_order_details DROP PRIMARY KEY");
        DB::statement("ALTER TABLE sales_order_details MODIFY id INT NULL");
    

这是实现目标的方法之一,希望对你有所帮助

【讨论】:

你是如何从id 中删除默认值的? 如果有主键,那么你不能提供空值,所以我首先删除主键,然后将列设置为可空,在可空字段中我们不需要提供默认空值 我说的是up 方法。您没有删除那里的默认值。 根据 SQL 标准,您无法将主键添加为 null,根据您的方法,您可以将主键字段设为 null,因此我已将其删除

以上是关于Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Laravel 迁移字段克隆到另一个迁移中?

Doctrine/dbal - 尝试将字符串字段更改为日期时出错

如何使用 Laravel 模式构建器更改列类型?

如何在mysql中使用laravel迁移将数据库列'null'更改为'nullable'?

laravel 模型迁移文件常规字段设计

在迁移 laravel 5.1 中设置自动增量字段从 1000 开始