PostgreSQL重置所有表Sequence

2023-10-31

sequence 是 pg 自带的高效的自增id工具(也叫序列)。sequence 使用了轻量级锁的方式来做到高效自增id的,所以会比 UPDATE 行锁快。sequence 的返回数据类型默认是64位的整数,pg 10 可以自定 smallint, integer 或者是 bigint。

为什么要重置sequence?

我目前使用的数据库时PostgreSQL 12,在将数据用Navcat导入之后。EF执行插入时报错,提示ID已经存在。最开始因为不了PostgreSQL的自增机制,还以为是EF有问题。查询资料后发现是因为sequence没有更新引起的错误,手动通过命令重置后就可以正常插入数据了。

在设计数据库,因为主键字段都是id,且设置了自增,便编写了一个脚本,将所有包含id自增字段的表的sequence重置为目前最大id。以后导入数据后重新执行一遍即可。

DO $$ DECLARE
TABLE_NAME TEXT;
maxid INT;
BEGIN
        FOR TABLE_NAME IN (
        SELECT
            tb.TABLE_NAME 
        FROM
            information_schema.tables AS tb
            INNER JOIN information_schema.COLUMNS AS cols ON tb.TABLE_NAME = cols.TABLE_NAME 
        WHERE
            tb.table_catalog = 'dncsdb' 
            AND tb.table_schema = 'public' 
            AND cols.COLUMN_NAME = 'id' 
        )
        LOOP
        EXECUTE'SELECT MAX(id) +1 FROM ' || TABLE_NAME || ';' INTO maxid;
    IF
        maxid IS NOT NULL THEN
            raise notice '%',
            'set sequence ' || TABLE_NAME || '_id_seq  restart with ' || maxid;
        EXECUTE 'alter sequence ' || TABLE_NAME || '_id_seq  restart with ' || maxid || ';';

    END IF;

END LOOP;

END $$;

或者可以通过以下命令手动进行重置。

查询所有的sequence:

select relname from pg_class where relkind='S' ;

查询表的最大id值:

select max(id) + 1 as seqid from content_info

重置sequence:

alter sequence your_sequence restart with your_value;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL重置所有表Sequence 的相关文章

随机推荐

  • java基础一

    java基础复习总结一 01 01 计算机基础知识 计算机概述 了解 A 什么是计算机 计算机在生活中的应用举例 计算机 Computer 全称 电子计算机 俗称电脑 是一种能够按照程序运行 自动 高速处理海量数据的现代化智能电子设备 由硬
  • CentOS7增加或修改SSH端口号

    第一步 修改SSH配置文件 注意是sshd config而不是ssh config 多了个d vim etc ssh sshd config 找到 Port 22 把两行的 号即注释去掉 修改成 Port 22 Port 50500 SSH
  • 用gSOAP开发Web Service程序

    http www cppblog com noswimfish archive 2010 09 07 126074 aspx gSOAP是一个绑定SOAP XML到C C 语言的工具 使用它可以简单快速地开发出SOAP XML的服务器端和客
  • LAPACK 求矩阵的逆

    original source http stackoverflow com questions 3519959 computing the inverse of a matrix using lapack in c Function in
  • 一个奇怪的问题:tomcat 栈溢出 StackOverflowError错误

    一个栈溢出错误 ava lang StackOverflowError at org apache catalina core ApplicationHttpRequest AttributeNamesEnumerator findNext
  • 关于Maven如何打Zip包

    1 通常我们使用Maven来打包Jar包 当我们需要打包成Zip包的时候就需要用到maven assembly plugin插件了 通过这个插件 不仅可以将源码打包 也能选择将一些特殊文件也打包进去 比如Build生成的Jar包
  • spark on yarn 完全分布式_从MR到Spark再到Ray,谈分布式编程的发展

    作为和Spark同出一脉的Ray 目前三个合伙人也创立了公司 叫Anyscale 参考这篇新闻 Anyscale raises 20 6 million to simplify writing AI and ML applications
  • ant 实践应用

    ant其实并非原生的Linux命令 但它 是一个使用广泛 功能强大的跨平台 构建工具程序 尤其是进行Java开发时 许多开源的Java项目都使用ant作为构建工具 ant 是apache自由软件基金会的一款开源软件 是java项目推崇的一款
  • 如何用golang快速构建一个CLI小工具02 - 解析文件

    如何用golang快速构建一个CLI小工具02 解析文件 在上一篇文章中 我们构建了一个叫autoSeletor的子命令用来随机选择我们输入的字符数组 在这篇中 我们来给我们的这个子命令加点功能 解析文件 我们希望通过文件的方式来作为输入
  • sqli-labs靶场搭建过程及报错解决方法

    下载后放在www目录下 我这里用的是phpstudy pro 修改数据库密码 运行时结果是这样的 查了好多资料说是php的版本不能超过5 5 我看了一下 也没超过5 5啊 然后我就去修改靶场代码 都修改了依旧报错 折腾好久后发现php的版本
  • 科大讯飞教育BG技术支持实习面试流水账(留给有缘人)

    这个岗位对于技术要求不是这么多 更多的是语言表达能力 1 科大讯飞在我们学校有宣讲 而我当时没有投 等过了段时间之后 其他的不是很满意 从某招聘软件上投的 面试官就问了这个问题 然后我的回答是 当时投了别的公司 对那些岗位不是很满意 于是想
  • Firefox上实现跨域访问

    IE浏览器可以在 工具 gt Internet 选项 gt 安全 gt 自定义级别 中启用 跨域浏览窗口和框架 通过域访问数据源 Firefox上如何设置呢 从 about config 里设置 signed applets codebas
  • 后端(一):Tomcat

    我们之前的前端是被我们一笔带过的 那不是我们要讲的重点 而这里的后端则是重点 本章先来认识认识后端的基础 Tomcat 是什么 我们先来聊聊什么叫做tomcat 我们熟悉的那个是汤姆猫 这和我们Java世界中的Tomcat 不是同一只猫 来
  • linux 杂记 怎么解决 cuda 10.1 跑 cuda8下的代码 error

    一个问题 error home dell cache Python Eggs correlation package 0 1 py2 7 linux x86 64 egg tmp correlation package ext corr c
  • 【满分】【华为OD机试真题2023 JAVA&JS】简单的解压缩算法

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 简单的解压缩算法 知识点栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数
  • obj : error LNK2019: 无法解析的外部符号 "public: __thiscall B::B(void)" (??0B@@QAE@XZ),该符

    今天在写类的简单实现时突然遇见这样的问题 最后发现是因为自己忘记实现构造函数的析构函数 class B public A public B B 出现该错误 obj error LNK2019 无法解析的外部符号 public thiscal
  • Linux Shell脚本字符串命令中的管道符处理

    问题 Linux shell字符串命令 等于包含多条命令 中的管道符 需用eval来求值 否则管道符 会被当做普通字符串来处理 输出非期望的结果 bin bash CMD ls l home if s 1 then CMD CMD grep
  • Deep Reinforcement Learning 基础知识(DQN方面)

    Introduction 深度增强学习Deep Reinforcement Learning是将深度学习与增强学习结合起来从而实现从Perception感知到Action动作的端对端学习的一种全新的算法 简单的说 就是和人类一样 输入感知信
  • Golang-使用 gvm 进行版本控制

    当你想为每个项目切换 go 版本时 gvm Go Version Manager 很方便 这里 我将介绍 如何在Mac上安装gvm 和 如何使用gvm 使用准备 仅适用于 Mac 的准备工作 按照MacOSX 要求中的说明执行以下命令 xc
  • PostgreSQL重置所有表Sequence

    sequence 是 pg 自带的高效的自增id工具 也叫序列 sequence 使用了轻量级锁的方式来做到高效自增id的 所以会比 UPDATE 行锁快 sequence 的返回数据类型默认是64位的整数 pg 10 可以自定 small