Laravel迁移 - 如何在后期将“id”字段更改为主键和自增

3

我的表'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();

       });
    }

我遇到了以下错误:
[Illuminate\Database\QueryException] SQLSTATE[42000]: 语法错误或访问冲突:1075 不正确的表定义;只能有一个自动列,并且必须定义为键 (SQL: ALTER TABLE sales_order_details CHANGE id id INT UNSIGNED AUTO_INCREMENT NOT NULL)
[Doctrine\DBAL\Driver\PDOException] SQLSTATE[42000]: 语法错误或访问冲突:1075 不正确的表定义;只能有一个自动列,并且必须定义为键
[PDOException] SQLSTATE[42000]: 语法错误或访问冲突:1075 不正确的表定义;只能有一个自动列,并且必须定义为键
如何使迁移正确?我正在使用版本5.4。

为什么你要写这两行代码 $table->integer('id')->default(NULL)->change(); $table->increments('id')->change(); 只有第二行是针对自增的。 - Ruchita Sheth
如果同时使用 defaultincrements,会出现问题吗? - Istiaque Ahmed
1个回答

5
你可以尝试这样做。
  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 的默认值的? - Istiaque Ahmed
如果有主键,您就无法赋予空值,因此我首先删除主键,然后将列设置为可为空,在可为空字段中,我们不需要提供默认的空值。 - Yashvantsinh Zala
我在谈论up方法。您没有在那里删除默认值。 - Istiaque Ahmed
根据 SQL 标准,您无法将主键设置为 null。而根据您的更新方法,您可以将主键字段设置为 null,因此我已将其删除。 - Yashvantsinh Zala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接