如何正确地将id生成器序列与表关联

时间:2015-10-07 01:29:00

标签: postgresql grails database-design

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

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

2 个答案:

答案 0 :(得分:3)

您可以在域类中定义生成器,如下所示:

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

如果序列已经存在于数据库中,那么您需要在params中对其进行命名。

还有documentation中概述的其他属性,例如:

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

答案 1 :(得分:0)

  

但是,该列似乎是使用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;

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

相关: