PostgreSql关联表刷新数据
实际项目中因为部门表ID有变化,需要修改所有其他业务表中关联的字段值。使用PostgreSql过程自动刷,效率较高,但更新数据动作危险系数较高,最好先备份数据。
1.关联表更新语法
更新数据,从另一张表根据条件获取数据。语法格式如下:
UPDATE b
SET column1 = a.column1,
column2 = a.column2,
column3 = a.column3
FROM a
WHERE a.id = b.id
AND b.id = 1
2.游标获取更新范围
表信息存储在information_schema.tables
中,字段信息在information_schema.COLUMNS
。这里v_fName
是特定需要更新的字段,根据该字段确定哪些表需要更新。
SELECT TABLE_NAME
FROM
information_schema.tables
WHERE
table_schema = 'public'
AND table_type = 'BASE TABLE'
AND "table_name" IN (
SELECT "table_name" FROM information_schema.COLUMNS
WHERE table_schema = 'public' AND "column_name" = v_fName
);
3. 完整代码
下面给出完成navicate代码,其他客户端结构可能有差异,关键业务代码都一样:
CREATE OR REPLACE PROCEDURE "public"."update_dept_id"("fname" varchar)
AS $BODY$
DECLARE
vTableName TEXT DEFAULT '';
vSql TEXT DEFAULT '';
-- 游标获取更新范围
cur_tables CURSOR FOR
SELECT TABLE_NAME
FROM
information_schema.tables
WHERE
table_schema = 'public'
AND table_type = 'BASE TABLE'
AND "table_name" IN (
SELECT "table_name" FROM information_schema.COLUMNS
WHERE table_schema = 'public' AND "column_name" = fname
);
BEGIN
OPEN cur_tables;
LOOP
FETCH cur_tables INTO vTableName;
EXIT WHEN NOT FOUND;
BEGIN
-- update vTableName data SQL
vSql := 'UPDATE ' || vTableName || ' A SET ' || fname || ' = B.route_id FROM s_depart B ' || ' WHERE A.' || v_fName || ' = B.id';
EXECUTE vSql;
EXCEPTION WHEN OTHERS THEN
-- 错误时打印sql,用于调试
Raise Notice 'update error:%',vSql;
END;
END LOOP;
CLOSE cur_tables;
END$BODY$
LANGUAGE plpgsql
4. 总结
本文介绍了PostgreSql通过过程刷数据的方法,希望有点参考价值。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/106387311