【问题标题】:Sequelize queryInterface bulkDelete does not reset id sequenceSequelize queryInterface bulkDelete 不重置id序列
【发布时间】:2021-12-30 21:09:13
【问题描述】:

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

我运行向上迁移以创建一个新实例

up: asyn (queryInterface) => {
  return await queryInterface.bulkInsert('keys', [{ clientKey: 'key123' }]);
}

我运行向下迁移以删除实例

down: async (queryInterface) => {
  return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] });
}

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

区别是

-SELECT pg_catalog.setval('public.keys_id_seq', 6, true);
+SELECT pg_catalog.setval('public.keys_id_seq', 7, true);

这使我的测试失败,因为由于这种差异,两个数据库的副本并不相同。即使我删除了那个键,根据这个document,它表示下一个 id 序列将从 8 而不是 7 开始。当前存在的表行是 1 到 6。有没有办法删除实例以使序列从 7 开始而不是 8?这意味着数据库的两个副本都应该有

SELECT pg_catalog.setval('public.keys_id_seq', 6, true);

我可以包括哪些选项?也许像

down: async (queryInterface) => {
  return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, { resetIdSequence: true });
}

【问题讨论】:

  • AFAIK 没有这样的选项。您应该手动将序列设置为所需的值。

标签: sql postgresql sequelize.js queryinterface bulk-delete


【解决方案1】:

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

truncate table table_name restart identity; 

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

select setval('your_table_id_seq', 1, false);

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

select setval('your_table_id_seq', COALESCE((select max(id)+1 from your_table), 1), false);

【讨论】:

  • 感谢您的评论。但我不想删除整个表。并且正在寻找一种方法来执行删除或 pg_dump,这样我就不必手动重置setval。看起来没有解决方案:(
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2021-04-05
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多