我正在使用Grails 3.0.7和Postgres 9.2。我对Postgres很新,所以这可能是一个愚蠢的问题。如何正确地将id生成器序列与表关联?我在某处读到,如果您创建一个具有serial
数据类型的id列的表,那么它将自动为该表创建一个序列。
但是,该列似乎是使用bigint
类型创建的。如何让Grails创建一个bigserial
数据类型的列,这甚至可以解决我的问题?如果我想要每个表一个序列怎么办?我只是不确定如何设置它,因为我过去从未真正使用过Postgres。
答案 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
分别创建smallint
,int
或bigint
列,附加到专用序列。文档:
数据类型
smallserial
,serial
和bigserial
不是真正的类型, 但仅仅是创建唯一标识符的符号方便 列(类似于某些人支持的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;
大报价,因为我无法比手册更好地描述它。
相关: