当前位置: 首页 > news >正文

PostgreSQL遍历所有的表并设置id为自增主键

这里写自定义目录标题

DO $$
DECLARE
table_info RECORD;
max_id BIGINT;
sequence_name TEXT;
schema_name TEXT := ‘ocean’;
error_message TEXT;
is_identity BOOLEAN;
BEGIN
FOR table_info IN (
SELECT c.table_name, c.column_name
FROM information_schema.columns c
WHERE c.column_name = ‘id’ AND c.table_schema = schema_name
)
LOOP
BEGIN
– 1. 查询当前表的最大 id
EXECUTE FORMAT(‘SELECT COALESCE(MAX(%I), 0) FROM %I.%I’,
table_info.column_name,
schema_name,
table_info.table_name
) INTO max_id;

  -- 2. 检查 id 列是否为 IDENTITY 类型EXECUTE FORMAT('SELECT EXISTS (SELECT 1 FROM pg_attribute aJOIN pg_class t ON a.attrelid = t.oidJOIN pg_namespace n ON t.relnamespace = n.oidWHERE n.nspname = %L AND t.relname = %L AND a.attname = %L AND a.attidentity <> '''')',schema_name,table_info.table_name,table_info.column_name) INTO is_identity;IF is_identity THEN-- 3. 如果是 IDENTITY 列,使用专用语法重置RAISE NOTICE 'Table: %I.%I is an IDENTITY column. Resetting...', schema_name, table_info.table_name;EXECUTE FORMAT('ALTER TABLE %I.%I ALTER COLUMN %I RESTART WITH %s',schema_name,table_info.table_name,table_info.column_name,max_id + 1);ELSE-- 4. 如果是普通列(可能使用 SERIAL 或手动序列),执行原逻辑RAISE NOTICE 'Table: %I.%I uses a regular sequence. Processing...', schema_name, table_info.table_name;sequence_name := schema_name || '.' || table_info.table_name || '_' || table_info.column_name || '_seq';-- 检查序列是否存在PERFORM 1FROM pg_class cJOIN pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind = 'S' AND c.relname = table_info.table_name || '_' || table_info.column_name || '_seq'AND n.nspname = schema_name;IF FOUND THEN-- 序列存在,设置其值EXECUTE FORMAT('SELECT setval(%L, %s)', sequence_name, max_id + 1);ELSE-- 序列不存在,创建并关联EXECUTE FORMAT('CREATE SEQUENCE %I.%I START WITH %s',schema_name,table_info.table_name || '_' || table_info.column_name || '_seq',max_id + 1);-- 检查并设置默认值PERFORM 1FROM information_schema.columnsWHERE table_schema = schema_nameAND table_name = table_info.table_nameAND column_name = table_info.column_nameAND column_default IS NULL;IF FOUND THENEXECUTE FORMAT('ALTER TABLE %I.%I ALTER COLUMN %I SET DEFAULT nextval(%L)',schema_name,table_info.table_name,table_info.column_name,sequence_name);END IF;END IF;END IF;-- 5. 统一检查并设置主键(两种类型都适用)PERFORM 1FROM information_schema.table_constraintsWHERE table_schema = schema_nameAND table_name = table_info.table_nameAND constraint_type = 'PRIMARY KEY';IF NOT FOUND THENRAISE NOTICE 'Setting PRIMARY KEY for table: %I.%I', schema_name, table_info.table_name;EXECUTE FORMAT('ALTER TABLE %I.%I ADD PRIMARY KEY (%I)',schema_name,table_info.table_name,table_info.column_name);END IF;RAISE NOTICE 'Successfully processed table: %I.%I', schema_name, table_info.table_name;EXCEPTIONWHEN OTHERS THENGET STACKED DIAGNOSTICS error_message = MESSAGE_TEXT;RAISE NOTICE 'Error processing table %I.%I: %', schema_name, table_info.table_name, error_message;
END;

END LOOP;
END
$$;

http://www.dtcms.com/a/602247.html

相关文章:

  • 免费的网站域名域名网站这么做
  • 虚拟化hypervisor:Xen简介
  • 【路径算法】基于JavaScript实现IDA*算法,动态可视化展示路径规划过程
  • 做境外网站临汾住房与城乡建设厅网站
  • 淘宝做链接的网站广告营销专业
  • 【网络编程基础知识】
  • js中哪些数据在栈上,哪些数据在堆上?
  • 上海云盾sdk游戏盾对比传统高防ip的优势
  • 系统配置重复项处理:经验未必可靠
  • 网站开发与应用 大作业作业辽宁省建设培训中心网站
  • 服务器与普通个人电脑的主要区别是什么?
  • 亚购物车功能网站怎么做的百度软件应用市场
  • 二项分布(Binomial Distribution)详解:从理论到实践
  • 深圳有没有什么网站重庆顶呱呱网站建设
  • 国外网站 设计成都注册公司核名网站
  • 衡阳网站建设开发价格谷歌推广新手教程
  • 【2025最新】05 Spring Security 构建 RESTful Web 注册服务
  • 基于java的无人驾驶物流配送与管理系统设计
  • 基于安卓的在线教育系统的设计与实现【附源码】
  • 河南网站seo地址深圳带停机坪的别墅
  • 专业做家具的网站swf上传wordpress
  • 硬件学习笔记--90 同步通信、异步通信、串行通信、并行通信介绍
  • linux练习1112-2
  • 力扣59 螺旋矩阵II java实现
  • 做网站内容需要自己填的建筑网校排行榜
  • 做推送好用的网站qq音乐怎么做mp3下载网站
  • 做家教有什么好的资料网站阜蒙县自治区建设学校网站
  • 无人机遥控接收机技术要点与难点
  • .NET高性能内存管理
  • [Powershell入门教程]第4天:模块、脚本编写、错误处理与 .NET 集成