Squeryl和PostgreSQL的自动增量

时间:2012-10-09 06:56:46

标签: postgresql squeryl

当我尝试使用Squeryl的Table.insert在PostgreSQL表中插入新记录时,会触发此查询:

insert into "users" ("id", "email", "fullname") values (nextval('"s_users_id"'),?,?)

这不起作用,因为我没有定义序列,而是将id列定义为“autoincrement”:

CREATE TABLE Users (
    id BIGSERIAL,
    email varchar(255) NOT NULL,
    fullname varchar(255),
    PRIMARY KEY (id)
);

我在另一个论坛上读到了一些关于这个问题的老帖子,我想知道现在的状态是什么。我们不鼓励使用自动增量并定义序列吗?或者有一个简单的解决方法来实现这个工作吗?

编辑:事实上我刚才看到autoincrement本身创建了一个序列,但是在另一个名称下:users_id_seq有没有办法告诉Squeryl看这个名字,或者遵循PostgreSQL的约定?

3 个答案:

答案 0 :(得分:8)

您可以声明序列的名称:

 case class Author(id: Long, firstName: String)             

 val author = table[Author]

 on(author)(s => declare(
    s.id is(autoIncremented("your_seq_name"))
 ))

更多信息:http://squeryl.org/schema-definition.html

答案 1 :(得分:4)

目前没有一种非常干净的方法可以做到,但可以做到。只是将PostgreSqlAdapter子类化并覆盖:

def createSequenceName(fmd: FieldMetaData)

答案 2 :(得分:3)

serialbigserial 在后台创建一个序列,从中获取列的值。所以插入基本上是正确的。

bigserial只是简写:

create sequence users_id_seq;
create table users (id bigint default nextval('users_id_seq'));

唯一似乎错误的是,您的id列的序列的默认名称为users_id_seq,而不是您工具使用的s_users_id

手册中的更多详细信息:http://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

修改
如果该工具采用错误的命名约定,则可能的一种解决方法是重命名生成的序列。正如Postgres"知道"它属于列,事情仍然有效。

ALTER SEQUENCE users_id_seq RENAME TO s_users_id;