postgresql 将所有表的id列设置为自增主键,自增起始数值为该表的最大id
2023-12-13 04:25:26
首先,使用`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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!