首页 > 解决方案 > 重命名后自动递增的字段没有默认值

问题描述

我需要重命名我的一张表和该表中的一列。

我用 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');
 });

标签: mysqlknex.js

解决方案


听起来像是 knex 中的错误。如果您还没有这样做,您应该将错误报告发送到 knex 问题。在那之前,您可以通过将新的 id 列手动设置为自动递增来解决它。您还可以查看使用 .toSQL() 生成的查询类型。

最好的一件事是完整的复制案例,您首先创建表,然后更改它并显示它失败了。这样人们就可以更容易地找出确切的问题。


推荐阅读