问题描述
我不小心删除了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,shipping_address_id,chaild_fields)
我不小心从ADDRESS_TABLE中删除了大部分数据。
-
ADDRESS_TABLE具有来自MAIN_TABLE的外键,即main_table_id。对于MAIN_TABLE中的每一行,ADDRESS_TABLE中都有两个条目,其中一个条目是其address_type为“计费/默认”,而另一个条目则是针对address_type为“装运”。
-
CHAID_TABLE有两个外键,一个来自MAIN_TABLE,即main_table_id,另一个来自ADDRESS_TABLE,即shipping_address_id。该shipping_address_id是ADDRESS_TABLE的地址ID,其address_type是正在运送的且ADDRESS_TABLE.main_table_id = CHAID_TABLE.main_table_id。
这些是我需要的东西。
- 我需要为MAIN_TABLE中的每个原始数据创建两个虚拟地址条目,一个是地址类型为“ billing / default”,另一个是地址类型为“ shipping”。
- 我需要将address_table_id插入其ADDRESS_TABLE.main_table_id = CHAID_TABLE.main_table_id的CHAID_TABLE中。和addres_type =“ shipping”
如果完成第一项,我知道如何插入第二项,因为这是一个简单的插入查询。我猜。 可以做到,
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中所有行的函数,在该循环内执行所需的操作,这里有两个insert语句,此解决方案的一个问题是您在所有地址中都有相同的数据。
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,other_fielsds)
VALUES('billing/default','other_fielsds');
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
SELECT * FROM get_all_MAIN_TABLE ();