将 Postgres 序列重置为下一个 ID
Reset Postgres Sequence to Next Id
发生了什么?
我们从 MySQL 迁移到 Postgres 并 Laravel 重新 运行 它是使用 psql 驱动程序而不是 mysql 的迁移。效果很好——它很好地设置了数据库。由于我们正在从 Laravel 移动到 Rails,我们创建了 rails 迁移以将字段重命名为更多 'rails-like' 以及将数据库数据(不是结构)导入邮递员。我们已经 运行 解决了很多问题,但最重要的是,现在序列已经被自动递增了。他们试图从 1.
开始
有什么想不通的?
我可以使用 SELECT pg_catalog.setval('availabilities_id_seq', 700, false);
之类的方法手动重置所有这些,但这不是很有帮助,因为我们在具有这么多表的多个环境中执行此操作。 有没有办法找到最后一个自增id,然后从中设置顺序?
如果您好奇,这里是 Rails 移动数据的迁移,以防有人知道我们是如何做错的(my_models 是表格数组):
my_models.each do |m|
puts m
"Mysql#{m}".constantize.find_each(batch_size: 100) do |old_model|
new_model = m.constantize.new
new_model.attributes = old_model.attributes
new_model.save
end
end
您可以查看以下讨论:
- Postgresql - Using subqueries with alter sequence expressions
- How to reset postgres' primary key sequence when it falls out of sync?
PostgreSQL wiki 也有针对您的案例的可能解决方案:Fixing Sequences.
发生了什么?
我们从 MySQL 迁移到 Postgres 并 Laravel 重新 运行 它是使用 psql 驱动程序而不是 mysql 的迁移。效果很好——它很好地设置了数据库。由于我们正在从 Laravel 移动到 Rails,我们创建了 rails 迁移以将字段重命名为更多 'rails-like' 以及将数据库数据(不是结构)导入邮递员。我们已经 运行 解决了很多问题,但最重要的是,现在序列已经被自动递增了。他们试图从 1.
开始有什么想不通的?
我可以使用 SELECT pg_catalog.setval('availabilities_id_seq', 700, false);
之类的方法手动重置所有这些,但这不是很有帮助,因为我们在具有这么多表的多个环境中执行此操作。 有没有办法找到最后一个自增id,然后从中设置顺序?
如果您好奇,这里是 Rails 移动数据的迁移,以防有人知道我们是如何做错的(my_models 是表格数组):
my_models.each do |m|
puts m
"Mysql#{m}".constantize.find_each(batch_size: 100) do |old_model|
new_model = m.constantize.new
new_model.attributes = old_model.attributes
new_model.save
end
end
您可以查看以下讨论:
- Postgresql - Using subqueries with alter sequence expressions
- How to reset postgres' primary key sequence when it falls out of sync?
PostgreSQL wiki 也有针对您的案例的可能解决方案:Fixing Sequences.