如何正确地将 id 生成器序列与表相关联
Posted
技术标签:
【中文标题】如何正确地将 id 生成器序列与表相关联【英文标题】:How to correctly associate an id generator sequence with a table 【发布时间】:2015-10-07 01:29:00 【问题描述】:我正在使用 Grails 3.0.7 和 Postgres 9.2。我对 Postgres 很陌生,所以这可能是一个愚蠢的问题。?我在某处读到,如果您创建一个具有 serial
数据类型的 id 列的表,那么它将自动为该表创建一个序列。
但是,该列似乎是使用bigint
类型创建的。如何让 Grails 创建具有 bigserial
数据类型的列,这甚至可以解决我的问题吗?如果我想要每张桌子一个序列怎么办?我只是不确定如何设置它,因为我过去从未真正使用过 Postgres。
【问题讨论】:
这可能会有所帮助:***.com/questions/7580807/… 我已经做到了。我可以毫无问题地生成序列。问题似乎是 grails 在创建表时将 bigint 数据类型与列相关联,而不是与 bigserial 相关联,因此无法正确使用序列。 【参考方案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
分别创建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;
大报价,我无法比手册更好地描述它。
相关:
Get table and column "owning" a sequence Safely rename tables using serial primary key columns【讨论】:
嗯,好的,那么我的 Grails 项目设置可能有问题,因为 id 列最终没有拥有相应的序列。我想这可能只是与 Postgres 相关的东西,因为我对 Postgres 的经验接近 0。以上是关于如何正确地将 id 生成器序列与表相关联的主要内容,如果未能解决你的问题,请参考以下文章
在php中,用CI框架开发程序,有两个表相连接,可以同时删除两个表相关联的数据吗?怎么写删除的代码?