当前位置: 首页 > 知识库问答 >
问题:

postgres在使用序列后未将标识列插入lastid 1

何星鹏
2023-03-14

我在postgres 12中有一个带有标识列(id)的表(表1)。表_1已经有数据,id列按顺序排列,如2、4、6、8、10等(偶数),最多1000个。现在从前端应用程序开始,我尝试输入数据,这些数据应该作为第1001条记录放在表中。我试图用以下两种方法创建序列,但没有成功。

CREATE SEQUENCE IF NOT EXISTS table_seq_id; 
SELECT setval('table_seq_id', (SELECT max(id)+1 FROM table_1), false);
ALTER TABLE table_1 ALTER COLUMN id SET DEFAULT nextval('table_seq_id');

select max(id) from table_1 into newid;
IF newid is null THEN newid = 1; else newid = newid + 1; END IF;
CREATE SEQUENCE IF NOT EXISTS table_seq_id; 
alter sequence  'table_seq_id' restart  with ' || newid;
ALTER TABLE table_1 ALTER COLUMN id SET DEFAULT nextval('table_seq_id');

它试图从1插入值,而不是从1001。对于奇数,将插入值,对于偶数,将引发以下错误错误:重复的键值违反了唯一约束pk_Table_1详细信息:键(id)=(24)已经存在。SQL状态:23505

在这个错误中,数字显示为24,如果我插入,它将插入25,并为26抛出相同的错误。

请输入您的建议。

表定义:

CREATE TABLE public."table_1" ( 
    "id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ), 
    "name" text COLLATE pg_catalog."default",
    CONSTRAINT "pk_public.table_1" PRIMARY KEY ("Id"), 
    CONSTRAINT "fk_public.table_1_public.Tenants_TenantId" 
        FOREIGN KEY 
            ("TenantId") REFERENCES public."Tenants" ("TenantId") 
        MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

共有1个答案

邴兴为
2023-03-14

GENERATED BY DEFAULT允许用户向列添加不来自序列的值。我怀疑还有其他东西在提供偶数。现在,该过程不提供数字,并且附加到标识的序列是,从1开始。因此,它适用于以前不存在的奇数,但不适用于偶数。可以通过以下操作以新值重新启动标识列:

altertablepublic。“table_1”更改列id,用1001重新启动

或是最大(id)1的数字

 类似资料:
  • 问题内容: 插入后如何在Oracle 12c中返回标识列(id)的值?似乎大多数方法都使用序列来获取插入项的ID。 问题答案: 只需使用 RETURNING 子句。 例如 - 测试用例 -

  • 我正在运行一个Web应用程序,它是一个rest API,我正在使用Wildfly 9.0.2和PostgreSQL。数据库连接使用最新的jdbc4.2驱动程序,jre是oracle的jr8。 我根据这个主题安装了jdbc,并且运行得很好。到目前为止,我使用wildfly管理控制台安装了数据源。 因此,当我尝试插入json字段时,问题出现了。我很快意识到JDBC没有直接的方法来插入json字段,比如

  • 问题内容: 在SQL Server中,是否可以使用存储过程在插入一些值的表中返回标识列的值?例如,如果我们在表中插入数据,则使用存储过程: 表TBL 用户ID整数,身份,自动递增 名称varchar 用户名varchar 密码varchar 因此,如果我运行存储过程插入一些值,例如: 我该如何返回此插入将发生的值。我需要其他一些操作的UserID值,有人可以解决吗? 问题答案:

  • 问题内容: 如何将上面插入语句中填充的标识值()插入表(另一个表)中 任何人都可以解释一下如何对更大的记录集(成千上万条记录)实施此操作吗? 我们可以使用loop和吗?如果是这样,请说明我们该怎么做? 如果我从选择查询中插入#test,会发生什么情况? 插入#test(b,c)中,从…中选择…(成千上万条记录) 我将如何捕获身份值并将该值用于另一个(#sample)插入#sample(e,f)插入

  • 本文向大家介绍C#在标识符中使用转义序列,包括了C#在标识符中使用转义序列的使用技巧和注意事项,需要的朋友参考一下 示例 转义序列不限于string和char文字。 假设您需要重写第三方方法: 并假定该字符Œ在用于C#源文件的字符编码中不可用。你是幸运的,它允许使用的类型逃逸\u####或者\U########在标识中的代码。所以写是合法的: 并且C#编译器将知道Œ并且\u0152是相同的字符。

  • 我正在尝试批量插入到具有标识列的表中。但我的主机文件包含标识列的空值。当我发出“bcp”命令时,我得到一个错误- 正在开始复制。。。 SQLState=S1000,NativeError=0 错误=[Microsoft][SQL服务器本地客户端10.0]在BCP数据文件中遇到意外的EOF SQLState=23000,NativeError=515 错误=[Microsoft][SQL Serve