我试图弄清楚如何在显式设置 ID 的同时将新数据插入数据库。但是,当我使用
nextval('user_seq')
时,它不会按预期从序列中检索下一个值;相反,它会根据我之前插入的值来增加它:CREATE TABLE users
(
user_id BIGINT NOT NULL,
user_firstname VARCHAR(50),
user_lastname VARCHAR(50),
user_nickname VARCHAR(100),
user_email VARCHAR(255),
user_password VARCHAR(255),
user_role VARCHAR(20),
CONSTRAINT pk_users PRIMARY KEY (user_id)
);
CREATE SEQUENCE IF NOT EXISTS user_seq START WITH 1 INCREMENT BY 50;
INSERT INTO users VALUES
(nextval('user_seq'), 'First Name', 'First Lastname', 'First Nickname', '[email protected]', 'First pass', 'USER_PRESENTER')
,(nextval('user_seq'), 'Second Name', 'Second Lastname', 'Second Nickname', '[email protected]', 'Second pass', 'USER_ELECTOR')
RETURNING *;
用户ID | 用户名 | 用户姓氏 | 用户昵称 | 用户_电子邮件 | 用户密码 | 用户角色 |
---|---|---|---|---|---|---|
1 | 名字 | 名字 | 第一个昵称 | [电子邮件受保护] | 第一关 | USER_PRESENTER |
51 | 第二个名字 | 第二个姓氏 | 第二个昵称 | [电子邮件受保护] | 第二关 | USER_ELECTOR |
我预计
nextval()
将从序列中获取下一个id,但nextval按“默认”值递增它。
我想过
currval()
,但这个方法应该在查询的上下文中。
我也尝试了
pg_get_serial_sequence()
,但我遇到错误,无法在此查询中使用它。
可能是我做错了什么,我以前没用过。
这一切都正常。如果您使用
START WITH 1 INCREMENT BY 50
定义序列,则对该序列调用 nextval()
将返回值 1、51、101、151 等。如果这不是您想要的,则必须以不同方式定义序列。
序列是一个计数器:第一次调用
nextval()
返回起始值,并且在每次后续调用中,计数器都会按 INCREMENT
递增(默认为 1)。