【问题标题】:How to correctly associate an id generator sequence with a table如何正确地将 id 生成器序列与表相关联
【发布时间】:2015-10-07 01:29:00
【问题描述】:

我正在使用 Grails 3.0.7 和 Postgres 9.2。我对 Postgres 很陌生,所以这可能是一个愚蠢的问题。如何正确地将 id 生成器序列与表相关联?我在某处读到,如果您创建一个具有 serial 数据类型的 id 列的表,那么它将自动为该表创建一个序列。

但是,该列似乎是使用bigint 类型创建的。如何让 Grails 创建具有 bigserial 数据类型的列,这甚至可以解决我的问题吗?如果我想要每张桌子一个序列怎么办?我只是不确定如何设置它,因为我过去从未真正使用过 Postgres。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/7580807/…
  • 我已经做到了。我可以毫无问题地生成序列。问题似乎是 grails 在创建表时将 bigint 数据类型与列相关联,而不是与 bigserial 相关联,因此无法正确使用序列。

标签: postgresql grails database-design


【解决方案1】:

您可以像这样在域类中定义生成器:

static mapping = {
    id generator:'sequence', params:[sequence:'domain_sq']
}

如果该序列已经存在于数据库中,那么您需要将其命名为 params

documentation 中列出的其他属性也可用,例如:

static mapping = {
 id column: 'book_id', type: 'integer'
}

【讨论】:

    【解决方案2】:

    Postgres 10 或更高版本中,请考虑使用 IDENTITY 列。见:


    但是,该列似乎是使用bigint 类型创建的。怎么做 我让 Grails 使用 bigserial 数据类型创建列,并将 这甚至解决了我的问题?

    这是预期的行为。将列定义为bigserial仅此而已您必须做。 Postgres 数据类型smallserial, serial and bigserial 分别创建smallintintbigint 列,并附加专用序列。手册:

    数据类型smallserialserialbigserial不是真正的类型, 但仅仅是创建唯一标识符的符号便利 列(类似于某些支持的 AUTO_INCREMENT 属性 其他数据库)。在当前实现中,指定:

    CREATE TABLE tablename (
        colname SERIAL
    );
    

    相当于指定:

    CREATE SEQUENCE tablename_colname_seq;
    CREATE TABLE tablename (
        colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
    );
    ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
    

    大报价,我无法比手册更好地描述它。

    相关:

    【讨论】:

    • 嗯,好的,那么我的 Grails 项目设置可能有问题,因为 id 列最终没有拥有相应的序列。我想这可能只是与 Postgres 相关的东西,因为我对 Postgres 的经验接近 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多