首页 > 数据库 >给PG数据库已有表,已存在列添加序列并设置序列当前值为自增列的最大值

给PG数据库已有表,已存在列添加序列并设置序列当前值为自增列的最大值

时间:2023-09-30 17:23:09浏览次数:39  
标签:EXECUTE name column 值为 增列 -- 序列 table

CREATE OR REPLACE FUNCTION "public"."add_sequence_to_table"("p_table_name" text, "p_column_name" text)
  RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
  max_value INTEGER;
  sequence_name text;
BEGIN
  -- 获取表的最大值
  EXECUTE format('SELECT COALESCE(MAX(%I), 0) FROM %I', p_column_name, p_table_name) INTO max_value;
  
  -- 检查是否已经存在同名的序列
  SELECT relname INTO sequence_name 
    FROM pg_class WHERE relname = p_table_name || '_' || p_column_name || '_seq';

  IF sequence_name IS NULL THEN
    -- 创建序列
    EXECUTE format('CREATE SEQUENCE %I', p_table_name || '_' || p_column_name || '_seq');
    
    -- 将序列的起始值设置为当前表的最大值
    EXECUTE format('ALTER SEQUENCE %I RESTART WITH %s', p_table_name || '_' || p_column_name || '_seq', (max_value + 1));
    
    -- 修改列的默认值为序列的下一个值
    EXECUTE format('ALTER TABLE %I ALTER COLUMN %I SET DEFAULT nextval(%L)', p_table_name, p_column_name, p_table_name || '_' || p_column_name || '_seq');
    
    RAISE NOTICE '成功将自增序列添加到表 % 的列 %,当前值已设置为 %', p_table_name, p_column_name, (max_value + 1);
  ELSE
    RAISE NOTICE '表 % 的列 % 已存在同名的序列', p_table_name, p_column_name;
  END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

 

标签:EXECUTE,name,column,值为,增列,--,序列,table
From: https://www.cnblogs.com/tangchun/p/17738037.html

相关文章

  • Leetcode 1143. 最长公共子序列
    https://leetcode.cn/problems/longest-common-subsequence/description/?envType=study-plan-v2&envId=top-100-liked给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回0。一个字符串的子序列是指这样一个新的字符串:它......
  • 《Java编程思想第四版》学习笔记32--关于static字段的序列化
    //:CADState.java//Savingandrestoringthestateofa//pretendCADsystem.importjava.io.*;importjava.util.*;abstractclassShapeimplementsSerializable{publicstaticfinalintRED=1,BLUE=2,GREEN=3;privateintxPos,yPos,dimension;p......
  • 最大上升子序列和
    题目概述:给定一个序列,求解该序列的最大上升子序列的和解题思路:我们在LIS的集合定义为:以i结尾的上升子序列的最大长度,那其实我们只需要将集合定义改为:以i结尾的上升子序列的最大和即可。#include<iostream>#include<algorithm>#include<cstring>#include<set>#include<v......
  • R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC、正则化广义矩估计和准最大似然估计上证
    全文链接:http://tecdat.cn/?p=31162最近我们被客户要求撰写关于SV模型的研究报告,包括一些图形和统计输出。本文做SV模型,选取马尔可夫蒙特卡罗法(MCMC)、正则化广义矩估计法和准最大似然估计法估计。模拟SV模型的估计方法:  sim<-svsim(1000,mu=-9,phi=0.97,sigma......
  • R语言Copula对债券时间序列数据的流动性风险进行度量|附代码数据
    全文链接:http://tecdat.cn/?p=32707原文出处:拓端数据部落公众号在金融市场中,债券的流动性风险一直是一个备受关注的问题。流动性风险是指在市场上,债券价格的波动程度受到市场流动性的影响,这种影响可能导致债券价格的剧烈波动,从而影响投资者的收益。因此,对于债券流动性风险的度量......
  • Java序列serialVersionUID字段
    Spring框架默认使用Java的序列化机制,也就是说,Spring默认使用Java的内置序列化器。Java的序列化机制中,每个序列化的对象都有一个serialVersionUID字段,这个字段用来标识序列化对象的版本。Java的序列化机制是这样的:当一个对象被序列化时,Java会先检查对象的类是否有一个名为"serialV......
  • 《prufer 序列》小记
    今天模拟赛被卡科技了,学一下这个东西,之前也看到很多次,只不过一直都没学。算法简介这是一种可以将带标号的树,转成唯一的整数序列表示的方法。而在“数树”题中也有大用。算法流程大概是将带标号的\(n\)个节点的数用\([1,n]\)中的\(n-2\)个整数来表示一个树。也可以理解成......
  • 【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)
    小瓦伦丁非常喜欢玩二叉树。她最喜欢的游戏是随机构建查找节点中带有大写字母的二叉树。这是她创作的一个例子:为了给后代记录她的树,她为每棵树写下了两个字符串:预订单遍历(根、左子树、右子树)和有序遍历(左子树、根、右子树。对于上面绘制的树,预序遍历是DBACEGF,有序遍历是ABCDEFG......
  • [JSON|序列化] fastjson自定义字段命名规则 (转发)
    1序言博主本人近期也遇到了基于fatsjson自定义命名字段规则的问题,为加强对此的学习和记忆,故转发这篇博文。博主本人最终采取的方法21.1前置知识fastjson在将对象转变为JSON字符串时,字段默认使用CamelCase规则命名。在1.2.15版本之后,fastjson支持配置Proper......
  • Python分享之序列的方法
    任何的序列都可以引用其中的元素(item)。下面的内建函数(built-infunction)可用于序列(表,定值表,字符串):#s为一个序列len(s)    返回:序列中包含元素的个数min(s)    返回:序列中最小的元素max(s)    返回:序列中最大的元素all(s)    返回:T......