【问题标题】:Grails generatingGrails 生成
【发布时间】:2013-04-30 10:01:06
【问题描述】:

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

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

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

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

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

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

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

我已经阅读了 (How to reset postgres' primary key sequence when it falls out of sync?) 上的提示,但这里不太适合,因为主键上没有序列号。

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

干杯。

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

【问题讨论】:

    标签: hibernate postgresql grails


    【解决方案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
    

    【讨论】:

    • 是的,问题不在于更新序列(我提供的链接解决了这个问题),它实际上只是查找序列实际存储的位置/方式,如果不是在数据库中的表中。
    • 序列是数据库对象。它们存储在内存中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2013-10-28
    相关资源
    最近更新 更多