首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后缀queryInterface bulkDelete不重置id序列

后缀queryInterface bulkDelete不重置id序列
EN

Stack Overflow用户
提问于 2021-12-30 21:09:13
回答 2查看 569关注 0票数 0

我使用pg_dump复制数据库,copy1.sql

我运行了一个up迁移来创建一个新实例。

代码语言:javascript
复制
up: asyn (queryInterface) => {
  return await queryInterface.bulkInsert('keys', [{ clientKey: 'key123' }]);
}

我运行一个向下迁移来删除实例

代码语言:javascript
复制
down: async (queryInterface) => {
  return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] });
}

我对数据库做了另一个pg_dumpcopy2.sql。我将数据库的第一个副本与数据库的第二个副本进行比较,以表明通过运行bash脚本diff "copy1.sql" "copy2.sql",向下迁移工作正常。

不同的是

代码语言:javascript
复制
-SELECT pg_catalog.setval('public.keys_id_seq', 6, true);
+SELECT pg_catalog.setval('public.keys_id_seq', 7, true);

这使得我的测试失败,因为由于这种差异,两个数据库的副本并不相同。尽管我删除了这个键,但根据这个文档的说法,下一个id序列将从8开始,而不是7。当前存在的表行是1到6。是否有方法删除实例,使序列从7开始,而不是8?这意味着数据库的两个副本都应该有

代码语言:javascript
复制
SELECT pg_catalog.setval('public.keys_id_seq', 6, true);

有什么可供选择的吗?也许就像

代码语言:javascript
复制
down: async (queryInterface) => {
  return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, { resetIdSequence: true });
}
EN

回答 2

Stack Overflow用户

发布于 2021-12-31 04:15:12

可以使用truncate table命令重置序列。Truncate table命令删除所有表数据。例如:

代码语言:javascript
复制
truncate table table_name restart identity; 

第二种方式使用setval手动重置。示例:

代码语言:javascript
复制
select setval('your_table_id_seq', 1, false);

如果不删除所有表数据,则建议将set序列值设置为记录的最大id。示例:

代码语言:javascript
复制
select setval('your_table_id_seq', COALESCE((select max(id)+1 from your_table), 1), false);
票数 0
EN

Stack Overflow用户

发布于 2022-04-03 16:46:09

我知道对您来说可能为时已晚,但我也遇到了同样的问题,通过在我的迁移文件中添加{restartIdentity: true} (例如我的一个表)解决了这个问题:

代码语言:javascript
复制
async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('card', {restartIdentity: true});
  }

为了确保工作正常,我在终端上尝试了几个“转”命令:

  • npx sequelize db:migratenpx sequelize db:seed:all:一切就绪:)
  • npx sequelize db:migrate:undo:all:没有桌子,很好!
  • npx sequelize db:migratenpx sequelize db:seed:all:一切都很好,外键仍然是好的,太棒了!

因此,对于您的代码,您可以尝试如下:

代码语言:javascript
复制
down: async (queryInterface) => {
  return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, {restartIdentity: true});
}

希望这会有所帮助;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70536724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档