我正忙于在 Grails 项目中进行从 MySQL 到 Postgres 的相当复杂的数据迁移。
我正在使用 GORM 在 PostGres 中生成模式,然后执行 MySQL -> mysqldump,一些数据操作,然后导入 Postgres。
显然,从 MySQL 转向 PSQL 的每个人都认为理所当然的是 id 列上的 auto_inc。结果,我为每个域对象添加了以下映射(根据各种站点和指南说明),它应该管理 id 列的所有排序:
静态映射 = { id 生成器:“序列” }
但是做一个 \d+ 帐户我看到以下行:
公共产品 ----------------------+---------------------------- --+------------+----------+- 编号 | 大整数 | 不为空 | 平原 |
...这与我的预期有些不同(我希望它是连续剧或大型连续剧)。所以,无论如何,我迁移数据,然后启动应用程序,然后通过 /product/create 操作添加产品来测试它。没有骰子,我可以看到一个休眠异常弹出,抱怨唯一键(插入语句尝试使用id
2。我刷新了几次页面(导致更多失败,但仍然增加了 nextval)。最终它得到142(表中目前有 141 个产品),然后它成功了。所以显然我必须更新表中使用的每个 id 序列的 nextval。遗憾的是,我不能真正告诉 wtf Grails 正在使用作为序列,因为它没有被表引用,数据库中也没有任何新表。
我已经阅读了(如何在 postgres 不同步时重置主键序列?)中的提示,但这并不适合这里,因为主键上没有序列号。
我可能会使用 min_lo 值(如果该sequence
方法甚至考虑非 hilo 策略的下限),但理想情况下我想要一些我可以运行一些 SQL 来修复迁移后的东西。
干杯。
编辑:PostGreSQL 9.1,Grails 2.0.3(是的,这将在迁移后更新)。