Skip to main content
 首页 » 数据库

PostgreSql关联表刷新数据

2022年07月19日126落叶

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
阅读延展