mysql - 重命名后自动递增的字段没有默认值
问题描述
我需要重命名我的一张表和该表中的一列。
我用 knex 迁移完成了下一个方法:
.alterTable('tableToRename', table => {
table.dropForeign('id_reference1');
table.dropForeign('id_reference2');
})
.alterTable('relatedTable1', table => {
table.dropForeign('tableToRename_id_col');
})
.renameTable('tableToRename', 'newName')
.alterTable('newName', table => {
table.renameColumn('tableToRename_id_col', 'tableToRename_new_id_col');
})
.alterTable('relatedTable1', table => {
table.renameColumn('tableToRename_id_col', 'tableToRename_new_id_col');
table.foreign('tableToRename_new_id_col').references('newName.tableToRename_new_id_col');
})
.alterTable('newName', table => {
table.foreign('id_reference1').references('table3');
table.foreign('id_reference2').references('table4');
})
所以现在当我尝试将新记录添加到newName表时 - 出现下一个错误:
错误(1366)HY000:“不正确的整数值:”列“tableToRename_new_id_col”在第 1 行“
如何以正确的方式重命名带有 id 的自动整数列?
服务器响应下一个错误:代码:'ER_NO_DEFAULT_FOR_FIELD',errno:1364,sqlMessage:'Field \'tableToRename_new_id_col\'没有默认值',sqlState:'HY000',索引:0,
UPD。以前我创建了一个我想重命名的表,如下所示:
.createTableIfNotExists('tableToRename', tab => {
t.charset('utf8mb4');
table.bigincrements('tableToRename_id_col')
.unsigned()
.primary()
.notNullable();
table.bigint('id_reference1')
.notNullable()
.unsigned()
.references('id_reference1')
.inTable('table_reference1');
table.bigint('id_reference2')
.notNullable()
.unsigned()
.references('id_reference2')
.inTable('table_reference2');
});
解决方案
听起来像是 knex 中的错误。如果您还没有这样做,您应该将错误报告发送到 knex 问题。在那之前,您可以通过将新的 id 列手动设置为自动递增来解决它。您还可以查看使用 .toSQL() 生成的查询类型。
最好的一件事是完整的复制案例,您首先创建表,然后更改它并显示它失败了。这样人们就可以更容易地找出确切的问题。
推荐阅读
- botframework - 在 Azure bot 服务中创建 Web App bot 后,Chatbot 无法工作
- python - 这个python条件语句是做什么的?
- android - 如何在android kotlin中编写开关条件的测试用例
- postgresql - 使用具有唯一约束的 SQLAlchemy 的 on_conflict_do_update()
- javascript - 无法在动态表上应用 onChange 事件
- nativescript - AbsoluteLayout 中的 Nativescript 自定义角度组件模板操作
- c++ - 使用 Bubble 排序 C++ 进行向量排序
- arrays - 将数组分配给结构中的数组
- c# - 如何导入canoe系统环境和符号并通过脚本构建vTeststudio
- bluetooth-lowenergy - BLE中蓝牙BD_ADDR和AccessAddress的关系