You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel迁移中定义integer字段长度并避免自动添加主键属性

你遇到的问题是对Laravel Schema构造器的integer()方法传参规则使用错误导致的。

Laravel提供的integer()方法的定义为:

integer(string $column, bool $autoIncrement = false, bool $unsigned = false)

第二个参数为布尔值,用于指定该字段是否为自增主键。你在定义字段时将15作为第二个参数传入,PHP会将非0的数值自动转换为布尔值true,因此所有传入15的integer字段都会被自动加上auto_increment和primary key属性,和你实际想要设置字段显示宽度的需求不符。

解决方法

如果你需要设置integer字段的显示宽度,改为通过链式调用length()方法实现,示例如下:

// 原错误写法
$table->integer('defCnt', 15)->default(0);
// 修改后正确写法
$table->integer('defCnt')->length(15)->default(0);

将你迁移代码中所有integer(xxx, 15)的写法全部按照上述规则调整后,即可生成符合预期的SQL语句,修改后的完整迁移代码如下:

Schema::create('tbl_corona_region', function(Blueprint $table){
    $table->string('seq', 30);
    $table->date('create_dt');
    $table->string('region_nm', 30);
    $table->string('region_cn', 30);
    $table->string('region_en', 30);
    $table->integer('defCnt')->length(15)->default(0);
    $table->integer('incDec')->length(15)->default(0);
    $table->integer('deathCnt')->length(15)->default(0);
    $table->integer('isolIngCnt')->length(15)->default(0);
    $table->integer('isolClearCnt')->length(15)->default(0);
    $table->integer('localOccCnt')->length(15)->default(0);
    $table->integer('overFlowCnt')->length(15)->default(0);
    $table->integer('qurRate')->length(15)->default(0);
    $table->dateTime('stdDay');
    $table->dateTime('update_dt');
    $table->primary(['seq', 'create_dt', 'region_nm']);            
});

补充说明

MySQL的int类型长度仅为查询时的显示宽度,不会影响字段实际可存储的数值范围。如果你的字段需要存储超过普通int范围(-2147483648 ~ 2147483647)的数值,建议直接使用bigInteger()等对应存储范围的字段类型,无需额外设置长度。

内容的提问来源于stack exchange,提问作者Sanghun Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 17:21:02