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();增量只需要第二个。default
和increments
一起使用不会出问题吗?
【参考方案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` 字段更改为主要字段并稍后自动递增的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine/dbal - 尝试将字符串字段更改为日期时出错