postgresql Sequelize queryInterface bulkDelete不会重置id序列

wribegjk  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(167)

我使用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_dumpcopy2.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);

这会使我的测试失败,因为由于这种差异,两个数据库的副本并不相同。即使我删除了那个键,它也说下一个id序列将从8开始,而不是根据这个document的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 });
}
iswrvxsc

iswrvxsc1#

可以使用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);
rqdpfwrv

rqdpfwrv2#

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

async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('card', {restartIdentity: true});
  }

为了确保它的工作,我尝试了几个“转弯”与这些命令在终端上:

  • npx sequelize db:migratenpx sequelize db:seed:all:一切都在原地:)
  • npx sequelize db:migrate:undo:all:没有table,很好!
  • npx sequelize db:migratenpx sequelize db:seed:all:一切都很好,外键还是好的,太棒了!

对于你的代码,你可以尝试这样做:

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

希望这有帮助;)

相关问题