本文介绍: 代码遍历所有具有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
$$

原文地址:https://blog.csdn.net/qq_32024669/article/details/134809789

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_44522.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注