PostgreSQL数据库序列的DDL获取和细节处理

news2024/11/18 5:31:57

PostgreSQL数据库序列的DDL获取和细节处理

    • 创建测试数据
    • dump导出方式
    • 表列与序列强关联
    • case场景
    • 序列DDL拼接SQL语句
    • 序列删除情况

看腻了就来听听视频演示吧:
SQL拼接获取DDL:https://www.bilibili.com/video/BV1Rw4m1Z7SV/
dump方式获取DDL:https://www.bilibili.com/video/BV1Wt421b75Q/

创建测试数据

-- 创建serial字段类型的表,序列和表有强关联关系
drop table if exists t_serial;
create table t_serial(col1 serial,col2 varchar(60));
insert into t_serial (col2) select md5(random()::text) from generate_series(1,10);
-- 直接创建序列使用,表的default默认值设置为序列值,序列和表并无强关联关系
drop table if exists t_test;
drop SEQUENCE if exists t_test_id_seq;
CREATE SEQUENCE t_test_id_seq START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
create table t_test(id int,name varchar(80));
alter table t_test alter COLUMN id set not null;
alter table t_test alter COLUMN id set default nextval('t_test_id_seq'::regclass);
insert into t_test (name) select md5(random()::text) from generate_series(1,10);

dump导出方式

把库和创建的表导出来看看情况:

-- 单库导出:CREATE TABLE -> CREATE SEQUENCE -> COPY -> setval
pg_dump testdb -f db_testdb_all.sql 
-- 单库仅导出DDL:1)serial:CREATE TABLE -> CREATE SEQUENCE 2)手动创建的序列:CREATE SEQUENCE -> CREATE TABLE 【没COPY导数据过程忽略setval步骤】
pg_dump testdb -s -f db_testdb_ddl.sql 
-- 导出serial类型的表:CREATE TABLE -> CREATE SEQUENCE -> COPY -> setval
pg_dump testdb -t public.t_serial -f tbl_t_serial.sql 
-- 导出手动创建序列使用的表:CREATE TABLE -> COPY 【默认序列已存在,不会导出序列】
pg_dump testdb -t public.t_test -f tbl_t_test.sql 

表列与序列强关联

pg_get_serial_sequence 返回与列关联的序列名

-- select pg_get_serial_sequence('表名','列名');
21:00:13 muser@testdb=> \df pg_get_serial_sequence 
                                  List of functions
   Schema   |          Name          | Result data type | Argument data types | Type 
------------+------------------------+------------------+---------------------+------
 pg_catalog | pg_get_serial_sequence | text             | text, text          | func
(1 row)

21:00:53 muser@testdb=> select pg_get_serial_sequence('t_serial','col1');
  pg_get_serial_sequence  
--------------------------
 public.t_serial_col1_seq
(1 row)

-- 手动创建的序列不会与表关联
21:01:01 muser@testdb=> select pg_get_serial_sequence('t_test','id');
 pg_get_serial_sequence 
------------------------
 
(1 row)
-- 调整序列为表列的所有者即关联序列后即可查询到,等效于serial类型
21:05:53 muser@testdb=> alter sequence t_test_id_seq owned by t_test.id;
ALTER SEQUENCE
21:06:15 muser@testdb=> select pg_get_serial_sequence('t_test','id');
 pg_get_serial_sequence 
------------------------
 public.t_test_id_seq
(1 row)

调整序列为表列的所有者后即等效于serial类型,dump导出效果也是一样的。

case场景

遇到一个需求:业务要当前使用的序列DDL,上面dump出来的数据就存在两个问题:
1). 单库或模式导出DDL的序列创建语句START WITH的值为下面视图的start_value,而非当前currval的值,即last_value。这就会出现序列重复冲突的问题
2). 单库包括数据一起导出,即CREATE TABLE -> CREATE SEQUENCE -> COPY -> setval,然后再过滤CREATE和setval语句。可满足需求但当数据量较大会使过滤文件耗时较长

image.png

记录序列的视图:

17:10:25 muser@testdb=> \d+ pg_sequences
                          View "pg_catalog.pg_sequences"
    Column     |  Type   | Collation | Nullable | Default | Storage | Description 
---------------+---------+-----------+----------+---------+---------+-------------
 schemaname    | name    |           |          |         | plain   | 
 sequencename  | name    |           |          |         | plain   | 
 sequenceowner | name    |           |          |         | plain   | 
 data_type     | regtype |           |          |         | plain   | 
 start_value   | bigint  |           |          |         | plain   | 
 min_value     | bigint  |           |          |         | plain   | 
 max_value     | bigint  |           |          |         | plain   | 
 increment_by  | bigint  |           |          |         | plain   | 
 cycle         | boolean |           |          |         | plain   | 
 cache_size    | bigint  |           |          |         | plain   | 
 last_value    | bigint  |           |          |         | plain   | 
View definition:
 SELECT n.nspname AS schemaname,
    c.relname AS sequencename,
    pg_get_userbyid(c.relowner) AS sequenceowner,
    s.seqtypid::regtype AS data_type,
    s.seqstart AS start_value,
    s.seqmin AS min_value,
    s.seqmax AS max_value,
    s.seqincrement AS increment_by,
    s.seqcycle AS cycle,
    s.seqcache AS cache_size,
        CASE
            WHEN has_sequence_privilege(c.oid, 'SELECT,USAGE'::text) THEN pg_sequence_last_value(c.oid::regclass)
            ELSE NULL::bigint
        END AS last_value
   FROM pg_sequence s
     JOIN pg_class c ON c.oid = s.seqrelid
     LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
  WHERE NOT pg_is_other_temp_schema(n.oid) AND c.relkind = 'S'::"char";

序列DDL拼接SQL语句

这里我们可以根据序列记录的视图来拼接下序列的DDL

-- 拼接public模式下的序列DDL
select 'create sequence ' || a.schemaname || '.' || a.sequencename || ' INCREMENT BY ' || a.increment_by || ' START WITH ' || a.last_value+1 || ' MAXVALUE ' || a.max_value || 
        case when a.cycle='t' then ' CYCLE' else ' NOCYCLE' end ||
        case when a.cache_size=1 then ' nocache' else ' cache ' || cache_size end || ';'
from pg_sequences a where a.schemaname='public';

这里拼接的序列DDL还有个小问题:新创建的序列last_value列值为null,需要先手动执行下nextval后才能搜索到
image.png

于是先拼接下last_value值为null的序列手动执行下

select 'select nextval(''' || a.schemaname || '.' || a.sequencename || '''::regclass)' || ';' from pg_sequences a where a.last_value is null;

image.png

序列删除情况

删除表时序列的情况

  • 序列和表有强关联关系:serial类型或调整过序列为表列的所有者即关联序列的情况,删除表对应序列会一起被删除
  • 序列和表无强关联关系:删除表对序列不影响

屏幕快照 20240224 10.59.13.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Windchill二次开发】针对该文档定义初始化规则,修改编号或名称的规则

(一)什么是软类型 类型属性定义: (二)对象初始化规则 rule(初始化规则) ---------------------------------------------------------------------------------------------------------------…

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽,大致可以分为两大类&#x…

探索矿业数字化平台:实现智能化采矿与管理

随着信息技术的迅猛发展,矿业领域也在逐步实现数字化转型。数字化平台的出现为矿业企业带来了更高效、更智能的采矿与管理方式。本文将探讨矿业数字化平台的意义、特点以及未来发展方向。 ### 1. 数字化平台的意义 传统的矿业生产和管理方式存在诸多问题&#xff…

Python实践应用|NC文件读取

import netCDF4 as nc import numpy as np import matplotlib.pyplot as plt# 打开NC文件 nc_file E:/NC_file/air.sig995.2012.nc # 将your_file.nc替换为你的NC文件路径 nc_data nc.Dataset(nc_file, r)# 查看NC文件中包含的变量 print("Variables in the NC file:&q…

Web3与物联网:探索区块链如何驱动智能设备的未来

引言 在数字化快速发展的时代,Web3技术和物联网(IoT)都成为了前沿技术的代表。两者的结合正逐渐展现出无限的可能性,尤其是在智能设备和数据安全方面。本文将深入探讨Web3如何与物联网相结合,以及这种结合对未来智能设…

csdn的复制代码功能如何实现

页面布局分析&#xff1a; 按钮在文本框里面&#xff0c;所以文本框是父元素&#xff0c;按钮是子元素。要使得按钮在文本框的右上角&#xff0c;需要使用绝对定位。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

Stylus 精讲:掌握这款 CSS 预处理器,让你的样式编写提升到新境界!

Stylus 是一种先进的 CSS 预处理器&#xff0c;它允许你使用更加强大和优雅的方式来编写 CSS。Stylus 拥有很多现代语言所具有的特性&#xff0c;如混合&#xff08;Mixins&#xff09;、函数、条件语句等&#xff0c;这些特性使得 CSS 的编写变得更加灵活和高效。Stylus 还支持…

Cokejogo巴西 电子游戏源码 游戏网站源码 电子游戏合集 电子游戏软件下载 游戏源码(带安装教程)

Cokejogo巴西pg电子游戏源码/H5PC端 前端vue编译后后端PHP/修复图片资源失效 后端测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkPHP&#xff0c;开启ssl证书 源码下载&#xff1a;https://download.csdn.n…

吾日三省吾身---对平常遇到的错误总结

✨个人主页&#xff1a; 不漫游-CSDN博客 前言 本篇文章是对平常练习遇到的问题总结&#xff0c;多吸取经验教训才能避免未来再犯~ Java语法部分 &#xff08;一&#xff09;多态 思考&#xff1a;这道题很明显考察的是多态的知识点&#xff0c;即一个对象可以被赋值给其父类…

基于SpringBoot+Vue校园二手交易系统的设计与实现

系统介绍 自从新冠疫情爆发以来&#xff0c;各个线下实体越来越难做&#xff0c;线下购物的人也越来越少&#xff0c;随之带来的是一些不必要的浪费&#xff0c;尤其是即将毕业的大学生&#xff0c;各种用品不方便携带走导致被遗弃&#xff0c;造成大量的浪费。本系统目的就是让…

【NR RedCap】Release 18标准中对5G RedCap的增强

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

PotatoPie 4.0 实验教程(28) —— FPGA实现sobel算子对摄像头图像进行边缘提取

什么是sobel算子&#xff1f; Sobel 算子是一种常用的边缘检测算子&#xff0c;用于在图像中检测边缘。它基于对图像进行梯度运算&#xff0c;可以帮助识别图像中灰度值变化较大的区域&#xff0c;从而找到图像中的边缘。 Sobel 算子通过计算图像的水平和垂直方向的一阶导数来…

[蓝桥杯2024]-Reverse:rc4解析(对称密码rc4)

无壳 查看ida 这里应该运行就可以得flag&#xff0c;但是这个程序不能直接点击运行 按照伪代码写exp 完整exp&#xff1a; keylist(gamelab) content[0xB6,0x42,0xB7,0xFC,0xF0,0xA2,0x5E,0xA9,0x3D,0x29,0x36,0x1F,0x54,0x29,0x72,0xA8, 0x63,0x32,0xF2,0x44,0x8B,0x85,0x…

【yolov8yolov5驾驶员抽烟-打电话-喝水-吃东西检测】

YOLO算法DMS驾驶员抽烟-打电话-喝水-吃东西检测数据集 YOLOv8和YOLOv5是深度学习中用于目标检测的先进算法&#xff0c;它们在实时性和准确性方面表现出色&#xff0c;适用于各种视频监控和图像处理应用&#xff0c;包括驾驶员行为监测。这些算法通过单次前向传播即可预测图像…

【FPGA】优化设计指南(一):设计原则

目录 避免采用不可综合的语句设计时采用同步的时钟组合逻辑与毛刺异步复位与同步复位动态分析与静态分析功能流水线时序违例乒乓操作面积和速度的平衡避免采用不可综合的语句 1.#1000延时语句 2.除法运算/,除非除数为2的整次幂 3.实数类型不可综合(real) 4.综上,使用可综合…

C++初阶之vector的使用和模拟实现

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.成员变量 二.默认构造 三.size和capacity函数 3.1库中的…

Qt的qtmqtt库连接onenet出现QMQTT::SocketRemoteHostClosedError解决方法

问题描述 在Qt发开过程中使用qtmqtt库来连接onenet的mqtt服务器&#xff0c;在ClientId、Username和Password均填写正确的情况下还是连接不上&#xff0c;查看错误显示QMQTT::SocketRemoteHostClosedError。 解决方法 client中的CleanSession标志位必须设置为true。 client …

ssh爆破模拟攻击(最基础)

攻击机&#xff08;192.168.83.136&#xff09; 靶机&#xff08;192.168.83.140&#xff09; 靶机打开22端口服务 centos7开启ssh 22端口_centos7开放22端口-CSDN博客 看这个师傅的操作 此实验对ssh端口漏洞利用的最基础实验 1、信息收集 发现22端口打开&#xff0c;尝…

k8s RBAC 角色访问控制详解与生产中的实际应用案例

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s简介 2、RBAC简介 二、RBAC关键…

Python_AI库 Pandas的数据结构及基本操作

Python_AI库 Pandas的数据结构及基本操作 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 本文篇幅较长&#xff0c;但比较重要&#xff0c;希望读者可以认真看完并实例运行。 Pa…