postgresql 将所有表的id列设置为自增主键,自增起始数值为该表的最大id

2023-12-06 04:44

本文主要是介绍postgresql 将所有表的id列设置为自增主键,自增起始数值为该表的最大id,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,使用`information_schema.columns`系统视图来获取所有具有 'id' 列的表的表名和列名。这个视图提供了有关数据库中所有表和列的元数据信息。

然后,使用循环来遍历每个满足条件的表,并执行以下操作:

1. 使用动态SQL语句来获取当前表的最大 id 值,并将结果存储在 max_id 变量中。`COALESCE`函数用于处理表中没有数据时的情况。

2. 创建一个序列,其名称是通过连接表名、列名和后缀 '_seq' 构成的。序列是用于生成自增值的。

3. 获取序列名称,并将其存储在 sequence_name 变量中。

4. 使用动态SQL语句来修改表的列,使用 `ALTER COLUMN` 子句设置默认值为 `nextval(sequence_name)`,即使用序列来自动生成值作为默认值。

5. 使用动态SQL语句来设置当前列为主键约束,使用 `ALTER TABLE` 和 `ADD PRIMARY KEY` 子句。

通过以上步骤,代码会遍历所有具有 'id' 列的表,并设置自增起始值和主键。

DO
$$
DECLAREtable_info RECORD;max_id BIGINT;sequence_name TEXT;
BEGINFOR table_info IN (SELECT table_name, column_nameFROM information_schema.columnsWHERE column_name = 'id')LOOP-- 获取当前表的最大idEXECUTE FORMAT('SELECT COALESCE(MAX(%I), 0)FROM %I',table_info.column_name,table_info.table_name) INTO max_id;-- 创建序列并设置自增起始值为当前表的最大id + 1EXECUTE FORMAT('CREATE SEQUENCE %I START %s',table_info.table_name || '_' || table_info.column_name || '_seq',max_id + 1);-- 获取序列名称EXECUTE FORMAT('SELECT %L',table_info.table_name || '_' || table_info.column_name || '_seq') INTO sequence_name;-- 执行ALTER TABLE来设置自增起始值EXECUTE FORMAT('ALTER TABLE %I ALTER COLUMN %I SET DEFAULT nextval(%L)',table_info.table_name,table_info.column_name,sequence_name);-- 执行ALTER TABLE来设置主键约束EXECUTE FORMAT('ALTER TABLE %I ADD PRIMARY KEY (%I)',table_info.table_name,table_info.column_name);END LOOP;
END
$$

这篇关于postgresql 将所有表的id列设置为自增主键,自增起始数值为该表的最大id的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/460480

相关文章

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们