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

7
我正在使用Grails 3.0.7和Postgres 9.2。我对Postgres非常陌生,所以这可能是一个愚蠢的问题。如何正确地将id生成器序列与表关联起来?我在某个地方读到,如果您创建一个具有serial数据类型的id列的表,则它将自动为该表创建一个序列。
但是,该列似乎是使用bigint类型创建的。如何让Grails使用bigserial数据类型创建列,并且这样做是否会解决我的问题?如果我想要每个表一个序列怎么办?我不确定如何设置这个,因为我以前从未真正使用过Postgres。

这个可能有帮助:https://dev59.com/B1vUa4cB1Zd3GeqPwLY_#7581050 - Joshua Moore
我已经完成了。我没有问题生成序列。问题似乎是在创建表时,grails将bigint数据类型与列关联而不是bigserial,因此序列不能正确使用。 - cloudwalker
2个回答

3
您可以在域类中定义生成器,例如:
static mapping = {
    id generator:'sequence', params:[sequence:'domain_sq']
}

如果序列已经存在于数据库中,则需要在params中命名它。
还有其他属性可用,如文档中所述,例如:
static mapping = {
 id column: 'book_id', type: 'integer'
}

1
在Postgres 10或更高版本中,请考虑使用IDENTITY列。参见:
然而,该列似乎是使用bigint类型创建的。我如何让Grails创建具有bigserial数据类型的列,并且这样做是否能解决我的问题?
这是预期的行为。将列定义为bigserial,这就是你要做的全部。Postgres的伪数据类型smallserialserialbigserial分别创建smallintintbigint列,并附加一个专用序列。手册:

The data types smallserial, serial and bigserial are not true types, but merely a notational convenience for creating unique identifier columns (similar to the AUTO_INCREMENT property supported by some other databases). In the current implementation, specifying:

CREATE TABLE tablename (
    colname SERIAL
);

is equivalent to specifying:

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的经验。 - cloudwalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接