如何在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
相关产品推荐
相关产品推荐

