当我尝试使用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的约定?
答案 0 :(得分:8)
您可以声明序列的名称:
case class Author(id: Long, firstName: String)
val author = table[Author]
on(author)(s => declare(
s.id is(autoIncremented("your_seq_name"))
))
答案 1 :(得分:4)
目前没有一种非常干净的方法可以做到,但可以做到。只是将PostgreSqlAdapter子类化并覆盖:
def createSequenceName(fmd: FieldMetaData)
答案 2 :(得分:3)
serial
或bigserial
将在后台创建一个序列,从中获取列的值。所以插入基本上是正确的。
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;