我正在使用PostgreSQL和我所有的表设置。我目前有一个表称为comments与一个主键称为comment_id,这是一个VARCHAR的长度为4。我有一个表单设置来插入一个新的注解到数据库中,但是我不知道如何让我的Java servlet从它以前的值++ comment_id。例如,0001到0002。
comments
comment_id
VARCHAR
fykwrbwg1#
你不想对你的id列使用VARCHAR,在postgres中你可以创建一个序列,然后为每次插入获取该序列的下一个值。here are the docs基本上,你会做一些
CREATE SEQUENCE mysequence START 101
然后,当您插入时,您可以执行以下操作
INSERT INTO my_comment values (nextval('mysequence'), 'this is my comment');
jfgube3f2#
更新:在Postgres 10或更高版本中,请考虑改为使用**IDENTITY**列。请参阅:
IDENTITY
开始使用**serial**伪数据类型。它会自动创建并附加序列对象,并将序列中的DEFAULT设置为nextval()。它可以完成所有您需要的操作。列的有效类型是integer。还有bigserial和smallserial(在Postgres 9.2+中)。只需按照手册的链接进行操作。
serial
DEFAULT
nextval()
integer
bigserial
smallserial
CREATE TABLE comments ( comment_id serial PRIMARY KEY , comment text NOT NULL );
您可以忽略INSERT命令的列:
INSERT
INSERT INTO my_comment (comment) VALUES ('My comment here');
comment_id会自动填入。但是你应该 * 总是 * 为INSERT命令提供一个目标列列表。如果你以后改变了表的布局,你的查询可能会以有害的方式中断。对于特殊命令或者当表的结构有保证时(比如当你在同一行代码中创建表时),跳过列列表可能是可以的。除此之外,提供一个列列表!如果您希望返回生成的comment_id,而不需要另一次到服务器的往返:
INSERT INTO my_comment (comment) VALUES ('My comment here'); **RETURNING** comment_id;
详细说明见说明书here。
2条答案
按热度按时间fykwrbwg1#
你不想对你的id列使用VARCHAR,在postgres中你可以创建一个序列,然后为每次插入获取该序列的下一个值。
here are the docs
基本上,你会做一些
然后,当您插入时,您可以执行以下操作
jfgube3f2#
更新:在Postgres 10或更高版本中,请考虑改为使用**
IDENTITY
**列。请参阅:开始使用**
serial
**伪数据类型。它会自动创建并附加序列对象,并将序列中的DEFAULT
设置为nextval()
。它可以完成所有您需要的操作。列的有效类型是integer
。还有bigserial
和smallserial
(在Postgres 9.2+中)。只需按照手册的链接进行操作。您可以忽略
INSERT
命令的列:comment_id
会自动填入。但是你应该 * 总是 * 为
INSERT
命令提供一个目标列列表。如果你以后改变了表的布局,你的查询可能会以有害的方式中断。对于特殊命令或者当表的结构有保证时(比如当你在同一行代码中创建表时),跳过列列表可能是可以的。除此之外,提供一个列列表!如果您希望返回生成的
comment_id
,而不需要另一次到服务器的往返:详细说明见说明书here。