如何在postgres中不使用nextval()从序列中获取id?

问题描述 投票:0回答:1

我试图弄清楚如何在显式设置 ID 的同时将新数据插入数据库。但是,当我使用

nextval('user_seq')
时,它不会按预期从序列中检索下一个值;相反,它会根据我之前插入的值来增加它:
db<>fiddle 的演示

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
  1. 我预计

    nextval()
    将从序列中获取下一个id,但nextval按“默认”值递增它。

  2. 我想过

    currval()
    ,但这个方法应该在查询的上下文中。

我也尝试了

pg_get_serial_sequence()
,但我遇到错误,无法在此查询中使用它。

可能是我做错了什么,我以前没用过。

sql postgresql sequence
1个回答
0
投票

这一切都正常。如果您使用

START WITH 1 INCREMENT BY 50
定义序列,则对该序列调用
nextval()
将返回值 1、51、101、151 等。如果这不是您想要的,则必须以不同方式定义序列。

序列是一个计数器:第一次调用

nextval()
返回起始值,并且在每次后续调用中,计数器都会按
INCREMENT
递增(默认为 1)。

© www.soinside.com 2019 - 2024. All rights reserved.