0

我正忙于在 Grails 项目中进行从 MySQL 到 Postgres 的相当复杂的数据迁移。

我正在使用 GORM 在 PostGres 中生成模式,然后执行 MySQL -> mysqldump,一些数据操作,然后导入 Postgres。

显然,从 MySQL 转向 PSQL 的每个人都认为理所当然的是 id 列上的 auto_inc。结果,我为每个域对象添加了以下映射(根据各种站点和指南说明),它应该管理 id 列的所有排序:

静态映射 = {
        id 生成器:“序列”
}

但是做一个 \d+ 帐户我看到以下行:

公共产品
----------------------+---------------------------- --+------------+----------+-
 编号 | 大整数 | 不为空 | 平原 |

...这与我的预期有些不同(我希望它是连续剧或大型连续剧)。所以,无论如何,我迁移数据,然后启动应用程序,然后通过 /product/create 操作添加产品来测试它。没有骰子,我可以看到一个休眠异常弹出,抱怨唯一键(插入语句尝试使用id2。我刷新了几次页面(导致更多失败,但仍然增加了 nextval)。最终它得到142(表中目前有 141 个产品),然后它成功了。所以显然我必须更新表中使用的每个 id 序列的 nextval。遗憾的是,我不能真正告诉 wtf Grails 正在使用作为序列,因为它没有被表引用,数据库中也没有任何新表。

我已经阅读了(如何在 postgres 不同步时重置主键序列?)中的提示,但这并不适合这里,因为主键上没有序列号。

我可能会使用 min_lo 值(如果该sequence方法甚至考虑非 hilo 策略的下限),但理想情况下我想要一些我可以运行一些 SQL 来修复迁移后的东西。

干杯。

编辑:PostGreSQL 9.1,Grails 2.0.3(是的,这将在迁移后更新)。

4

1 回答 1

1

请参阅本文档。您必须在启动应用程序之前更新序列。

http://www.postgresql.org/docs/9.1/static/functions-sequence.html

currval(regclass)                   bigint  Return value most recently obtained with nextval for specified sequence
lastval()                           bigint  Return value most recently obtained with nextval for any sequence
nextval(regclass)                   bigint  Advance sequence and return new value
setval(regclass, bigint)            bigint  Set sequence's current value
setval(regclass, bigint, boolean)   bigint  Set sequence's current value and is_called flag
于 2013-05-06T19:07:37.860 回答