Laravel 将 `id` 更改为 `AUTO_INCREMENT`

Posted

技术标签:

【中文标题】Laravel 将 `id` 更改为 `AUTO_INCREMENT`【英文标题】:Laravel change `id` to `AUTO_INCREMENT` 【发布时间】:2019-11-15 05:49:24 【问题描述】:

我有一个persons 表和blogs 表。 我想将persons 表的id 列更改为AUTO_INCREMENT

但它会引发错误。

人员表

id - integer (not auto_increment)
name - string

博客表

id - integer (auto_increment)
title - string
description - text
created_by - integer (foreign key) 

我创建了一个迁移来更改 idpersons 表。

更改用户迁移

Schema::table('persons', function (Blueprint $table) 
            $table->bigIncrements('id')->change();
        );

我抛出一个错误

  Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1833 Cannot change column 'id': used in a foreign key constraint 'blogs_created_by_foreign' of table 'db.blogs' (SQL: ALTER TABLE persons CHANGE id id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL)

当我尝试这种方式时。

    public function up()
    
        \DB::statement("LOCK TABLES  blogs WRITE, persons WRITE;");
        \DB::statement("ALTER TABLE blogs DROP FOREIGN KEY created_by, MODIFY id INT UNSIGNED;");
        \DB::statement("ALTER TABLE persons MODIFY id INT UNSIGNED AUTO_INCREMENT;");
        \DB::statement("ALTER TABLE blogs ADD CONSTRAINT created_by FOREIGN KEY (id) REFERENCES persons (id); UNLOCK TABLES;");

    

错误:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. (SQL: LOCK TABLES  blogs WRITE, persons WRITE;)

【问题讨论】:

试试这个***.com/questions/13606469/…。 这能回答你的问题吗? Cannot change column used in a foreign key constraint 我抛出一个错误。我更新了我的问题。 【参考方案1】:

禁用外键检查然后启用它

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
        Schema::table('persons', function (Blueprint $table) 
            $table->bigIncrements('id')->change();
        );
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');

【讨论】:

我想把id列改成递增,但问题是foreign key constraintblogs表中 我将 bigIncrements 更改为 increments 并且它有效。谢谢兄弟。

以上是关于Laravel 将 `id` 更改为 `AUTO_INCREMENT`的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将 html id 更改为变量 Laravel

在 Laravel Passport 中将用户模型主键 ID 更改为另一个

Mongoose 将 _id 更改为 id

将公共目录更改为 public_html 后的 Laravel

将 MongoDB 中的 _id 类型更改为整数是不是不好?