重命名后自动递增的字段没有默认值
No default for field with auto increment after renaming
我需要重命名我的一个 table 和这个 table 中的一个列。
我已经用 knex migration 的下一个方法完成了:
.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 添加新记录时 table - 出现下一个错误:
错误 (1366) HY000:第 1 行的 "tableToRename_new_id_col" 列 "Incorrect integer value:"“
如何以正确的方式重命名带有 id 的自动整数列?
服务器响应下一个错误:
代码:'ER_NO_DEFAULT_FOR_FIELD',
错误号:1364,
sqlMessage: '字段 \'tableToRename_new_id_col\' 没有\'t have a default value',
sqlState: 'HY000',
索引:0,
UPD. 之前我创建了一个 table,我想这样重命名:
.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 issues。在那之前,您可以通过将新的 id 列设置为手动自动递增来解决它。您还可以查看使用 .toSQL() 生成的查询类型。
最好的一件事是完整的复制案例,您首先创建 table 然后更改它并显示它失败了。这样别人就可以更容易地找出确切的问题。
当您想在没有所有数据的情况下插入新位置时,这是 mysql 设置。
如果不发送值,您可以将 mysql 配置为设置 NULL。
临时解决方案(直到您重新启动服务器):
设置@@GLOBAL.sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
或者您可以在 my.ini 文件中设置它。
以下是模式详情:http://webnetkit.com/error-sqlstatehy000-general-error-1366-incorrect-integer-value-for-column/
我需要重命名我的一个 table 和这个 table 中的一个列。
我已经用 knex migration 的下一个方法完成了:
.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 添加新记录时 table - 出现下一个错误:
错误 (1366) HY000:第 1 行的 "tableToRename_new_id_col" 列 "Incorrect integer value:"“
如何以正确的方式重命名带有 id 的自动整数列?
服务器响应下一个错误: 代码:'ER_NO_DEFAULT_FOR_FIELD', 错误号:1364, sqlMessage: '字段 \'tableToRename_new_id_col\' 没有\'t have a default value', sqlState: 'HY000', 索引:0,
UPD. 之前我创建了一个 table,我想这样重命名:
.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 issues。在那之前,您可以通过将新的 id 列设置为手动自动递增来解决它。您还可以查看使用 .toSQL() 生成的查询类型。
最好的一件事是完整的复制案例,您首先创建 table 然后更改它并显示它失败了。这样别人就可以更容易地找出确切的问题。
当您想在没有所有数据的情况下插入新位置时,这是 mysql 设置。
如果不发送值,您可以将 mysql 配置为设置 NULL。 临时解决方案(直到您重新启动服务器): 设置@@GLOBAL.sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
或者您可以在 my.ini 文件中设置它。 以下是模式详情:http://webnetkit.com/error-sqlstatehy000-general-error-1366-incorrect-integer-value-for-column/