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
$$
DECLARE
  table_info RECORD;
  max_id BIGINT;
  sequence_name TEXT;
BEGIN
  FOR table_info IN (
    SELECT table_name, column_name
    FROM information_schema.columns
    WHERE column_name = 'id'
  )
  LOOP
    -- 获取当前表的最大id
    EXECUTE FORMAT('
      SELECT COALESCE(MAX(%I), 0)
      FROM %I',
      table_info.column_name,
      table_info.table_name
    ) INTO max_id;
    
    -- 创建序列并设置自增起始值为当前表的最大id + 1
    EXECUTE 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
$$

相关推荐

  1. 如何PostgreSQL设置

    2023-12-08 19:16:04       25 阅读
  2. pgsql已有设置

    2023-12-08 19:16:04       17 阅读
  3. 跟大家分享一个id策略OUID

    2023-12-08 19:16:04       21 阅读
  4. MySQL中设置id从1开始

    2023-12-08 19:16:04       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 19:16:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 19:16:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 19:16:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 19:16:04       20 阅读

热门阅读

  1. 消融实验:深度学习的关键分析工具

    2023-12-08 19:16:04       43 阅读
  2. Mysql、Oracle区分大小写?

    2023-12-08 19:16:04       40 阅读
  3. python使用conda管理多个环境

    2023-12-08 19:16:04       39 阅读
  4. 游戏策划常用的ChatGPT通用提示词模板

    2023-12-08 19:16:04       41 阅读
  5. Day42| Leetcode 416. 分割等和子集

    2023-12-08 19:16:04       41 阅读
  6. 【Spark基础】-- 理解 Spark shuffle

    2023-12-08 19:16:04       39 阅读
  7. spark 写入 hudi时数据类型报错

    2023-12-08 19:16:04       40 阅读
  8. qt 安装

    2023-12-08 19:16:04       30 阅读