我使用pg_dump复制数据库,copy1.sql。
我运行了一个up迁移来创建一个新实例。
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 });
}发布于 2021-12-31 04:15:12
可以使用truncate table命令重置序列。Truncate table命令删除所有表数据。例如:
truncate table table_name restart identity; 第二种方式使用setval手动重置。示例:
select setval('your_table_id_seq', 1, false);如果不删除所有表数据,则建议将set序列值设置为记录的最大id。示例:
select setval('your_table_id_seq', COALESCE((select max(id)+1 from your_table), 1), false);发布于 2022-04-03 16:46:09
我知道对您来说可能为时已晚,但我也遇到了同样的问题,通过在我的迁移文件中添加{restartIdentity: true} (例如我的一个表)解决了这个问题:
async down(queryInterface, Sequelize) {
await queryInterface.dropTable('card', {restartIdentity: true});
}为了确保工作正常,我在终端上尝试了几个“转”命令:
npx sequelize db:migrate,npx sequelize db:seed:all:一切就绪:)npx sequelize db:migrate:undo:all:没有桌子,很好!npx sequelize db:migrate,npx sequelize db:seed:all:一切都很好,外键仍然是好的,太棒了!因此,对于您的代码,您可以尝试如下:
down: async (queryInterface) => {
return await queryInterface.bulkDelete('keys', { clientKey: ['key123'] }, {restartIdentity: true});
}希望这会有所帮助;)
https://stackoverflow.com/questions/70536724
复制相似问题