我有一个名为document
的表及其序列document_seq
。我在项目中使用了多个堆栈(节点和播放框架以及数据库,如Postgres)。假设我的文档表的最后一个id是119,然后我尝试从节点插入一行,然后它变成120(document_id),然后尝试通过play框架进入文档表,那么它应该生成121,但代替的是在文档中插入120作为列的ID,因此文档表会产生ID错误的重复。当我在插入数据后用顺序检查时,它比上一个值增加+20或更多时间。
针对此问题
我已经尝试通过创建触发器来重置sequence_id,它将使用最后一个document_id重置序列。
也试图删除document_seq并设置document_id为序列号,但出现序列错误。
您不需要使用触发器。在PostgreSQL中,可以使用特殊数据类型serial
,如documentation中所述。
如果创建类似表:
CREATE TABLE document (
id SERIAL,
text title
);
您可以非常容易地插入这样的数据:
insert into documents (title) values('text');
并且该序列正常工作。 serial
是快捷方式或宏,并被翻译为:
CREATE SEQUENCE document_id_seq AS integer;
CREATE TABLE document (
id integer NOT NULL DEFAULT nextval('document_id_seq'),
text title
);
ALTER SEQUENCE document_id_seq OWNED BY document.id;
您也可以使用上述命令。在列定义的默认部分中使用nextval
非常重要。 secquence函数nextval
一步读取并增加序列。