0

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);

这使我的测试失败,因为由于这种差异,两个数据库的副本并不相同。即使我删除了那个键,它表示下一个 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 });
}
4

1 回答 1

0

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);
于 2021-12-31T04:15:12.400 回答