首页 > 数据库 >PostgreSQL重置所有Sequence启始值

PostgreSQL重置所有Sequence启始值

时间:2022-09-18 18:35:56浏览次数:118  
标签:PostgreSQL NAME sequence Sequence au pg TABLE id 启始

目录

适用范围

pg12+

方案概述

在从ORACLE迁移到PG的过程中,当导入数据后,在启动应用时,Sequence 往往是从1开始,数表的的数据肯定是是超过1的,这时插入数据库会失败。
这时需要我们手动重设Sequence ,以保证Sequence 能正常插入到中而与表里原来的数据不冲突。

实施步骤

1.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 $$;

2.sequence不是表的自增主键

如有SEQ 没有在建表语句中,而是在使用的才用,那么这时就不好判断, 这个SEQ属于那一个表.如果不知道,那个SEQ属于那个表, 我们以最大表为基准。 将所有SEQ的启始值,从最大表的行数开始

#a.指定用户查询表的行数
SELECT
	relname,relowner,
	reltuples 
FROM
	pg_class 	CLS 
    LEFT JOIN pg_namespace N ON ( N.oid = CLS.relnamespace ) 
   	LEFT JOIN pg_authid au ON  (CLS.relowner=au.oid)
WHERE
	nspname NOT IN ( 'pg_catalog', 'information_schema','postgres' ) 
    and au.rolname='ahser'
	AND relkind = 'r' 
ORDER BY
	reltuples DESC;

#b.根据上表查询的最大行数值 ,浮动1000 在设置, 我们查最大表行数为44000,而且通过 count计算也确实是44000,所以我们直接将所有SEQ的起始值设为44000
   select 'alter sequence  IF EXISTS '||relname ||'  start with 44000   MAXVALUE 99999999;;' 
   from pg_class CLS
   LEFT JOIN pg_authid au ON  (CLS.relowner=au.oid)
   where relkind='S'
  and au.rolname='ahser';

#c.在psql中执行 b所生成的动态SQL语句。

标签:PostgreSQL,NAME,sequence,Sequence,au,pg,TABLE,id,启始
From: https://www.cnblogs.com/cqdba/p/16705401.html

相关文章

  • [uvm sequence专题] objection in sequence (sequence中objection的用法以及UVM1.1d 1
    objectioninsequence(sequence中objection的用法以及UVM1.1d1.2的区别)1前言在UVM中,除了在各个taskphase中会出现控制objection的情况,在defaultsequence的执行中......
  • PostgreSQL-数据类型4
    一、range类型范围类型是表示某个元素类型(称为范围的子类型)的一系列值的数据类型。例如,时间戳的范围可用于表示会议室预定的时间范围。在这种情况下,数据类型是tsrange(“t......
  • PostgreSQL数据库、模式、表、空间、用户间的关系
    PostgreSQL数据库、模式、表、空间、用户间的关系(1)DB实例与schema:模式是数据库实例的逻辑分割。数据库是被模式(schema)来切分的,一个数据库至少有一个模式,所有数据库......
  • PostgreSQL-数据类型3
    一、数组类型PostgreSQL允许将表的列定义为可变长度的多维数组。可以创建任何内置或用户定义的基本类型、枚举类型、复合类型、范围类型或域的数组。为了说明数组类型的......
  • CF438D The Child and Sequence
    CF438DTheChildandSequence洛谷链接同一个思路AC四道题太爽了题目大意:区间求和,区间取模,单点修改。分析:难点在于区间取模很难实现标记下传以及合并。思路和线段......
  • PostgreSQL-数据类型2
    一、Enumerated类型枚举(enum)类型是包含一组静态、有序值的数据类型。它们等效于许多编程语言中支持的枚举类型。枚举类型的一个示例可能是星期几,或者是一组数据的状态值......
  • postgresql/lightdb中分区的Constraint Exclusion详解
    在postgresql10支持声明式分区之前,分区是通过继承实现的,如下:CREATETABLEmeasurement(city_idintnotnull,logdatedatenotnull,......
  • PostgreSQL-数据类型1
    一、数字类型整数类型:SQL仅指定整数类型integer(或int)、smallint和bigint。类型名称int2、int4和int8是扩展,其他一些SQL数据库系统也使用它们。数值类型num......
  • postGIS+postgreSQL+Supermap部署GIS数据
    1.在postGIS中创建XX_gisdb数据库,参数如下图所示,在架构中再创建gcj02架构;2.在超图中新建数据库型数据源;3.将要素表+字段表存在mdb个人地理数据库中,通过在超图中导入要素......
  • postgresql/lightdb CommandCounterIncrement()函数的作用
    CommandCounterIncrement的作用是使当前事务中前面语句的修改对本语句可见,相当于oracle中的当前读概念(currentread,只不过oracle区分,pg不区分)。事务中每执行一个语句后......