postgresql - 意外检测到表中的所有数据,使用循环 psql 将虚拟数据插入表
问题描述
我不小心删除了我的 Postgres 表中的大部分行(数据在我的测试环境中并不重要,但我需要一个虚拟数据插入到这些表中)。
让我们拿三张桌子,
MAIN_TABLE(main_table_id, main_fields)
ADDRESS_TABLE(address_table_id, main_table_id, address_type, other_fielsds)
CHAID_TABLE(chaid_table_id,main_table_id, shipping_address_id, chaild_fields)
我不小心删除了 ADDRESS_TABLE 中的大部分数据。
ADDRESS_TABLE 有一个来自 MAIN_TABLE 的外键,即 main_table_id。对于 MAIN_TABLE 中的每一行,ADDRESS_TABLE 中有两个条目,其中一个条目是其 address_type 是“计费/默认”,另一个条目是 address_type “shipping”。
CHAID_TABLE 有两个外键,一个来自 MAIN_TABLE,即 main_table_id,另一个来自 ADDRESS_TABLE,即 shipping_address_id。这个 shipping_address_id 是 ADDRESS_TABLE 的地址 id,它的 address_type 是 shipping 并且 ADDRESS_TABLE.main_table_id = CHAID_TABLE.main_table_id。
这些是我需要的东西。
- 我需要为 MAIN_TABLE 中的每个原始地址创建两个虚拟地址条目,一个是地址类型“计费/默认”,另一个是“运输”类型。
- 我需要将 address_table_id 插入其 ADDRESS_TABLE.main_table_id = CHAID_TABLE.main_table_id 的 CHAID_TABLE。和 addres_type =“航运”
如果第一个完成,我知道如何插入第二个,因为它是一个简单的插入查询。我猜。可以这样做,
UPDATE CHAID_TABLE
SET shipping_address_id = ADDRESS_TABLE.address_table_id
FROM ADDRESS_TABLE
WHERE ADDRESS_TABLE.main_table_id = CHAID_TABLE.main_table_id
AND ADDRESS_TABLE.addres_type ='shipping';
对于第一个,我可以在 psql 中使用循环,即遍历 MAIN_TABLE 中的所有条目并为每行插入两个虚拟行。但我不知道该怎么做,请帮我解决这个问题。
解决方案
我希望你的解决方案是这样的,创建一个循环遍历 MAIN_TABLE 中所有行的函数,在循环内部执行你想要的操作,这里有两个插入语句,这个解决方案的一个问题是你在所有地址中都有相同的数据。
CREATE OR REPLACE FUNCTION get_all_MAIN_TABLE () RETURNS SETOF MAIN_TABLE AS
$BODY$
DECLARE
r MAIN_TABLE %rowtype;
BEGIN
FOR r IN
SELECT * FROM MAIN_TABLE
LOOP
-- can do some processing here
INSERT INTO ADDRESS_TABLE ( main_table_id, address_type, other_fielsds)
VALUES('shipping', r.main_table_id,'NAME','','other_fielsds');
INSERT INTO ADDRESS_TABLE ( main_table_id, address_type, other_fielsds)
VALUES('billing/default',r.main_table_id,'NAME','','other_fielsds');
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
SELECT * FROM get_all_MAIN_TABLE ();
推荐阅读
- ios - 在 ChildView 中预览 Core Data 实体
- html - 基于单击 Vuejs 中的按钮显示/隐藏警报
- c++ - 带有 constexpr 声明变量的奇怪错误 C2131
- javascript - 我收到 javascript 错误,例如 Uncaught TypeError: Cannot set property 'user' of undefined 当我单击添加注释按钮时
- c# - C# 与列表相交
- c - scons: 警告: 不推荐在没有错误的情况下调用缺少的 SConscript
- jquery - jQuery命令没有给出想要的结果
- math - 为什么矩阵在赋值后会改变一行的值?- 枫木
- javascript - 我想通过 javascript sum value onclick 函数结果得到一个值,但我想修复 value 2 dicimal?
- python - 如何用数据集中的小名称替换较长的列名称列表?