微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

意外地从表中检测到所有数据,使用循环psql

如何解决意外地从表中检测到所有数据,使用循环psql

我不小心删除了Postgres表中的大多数行(数据在我的测试环境中并不重要,但是我需要在这些表中插入一个虚拟数据)。

让我们坐三张桌子,

  1. MAIN_TABLE(main_table_id,main_fields)
  2. ADDRESS_TABLE(address_table_id,main_table_id,address_type,other_fielsds)
  3. CHAID_TABLE(chaid_table_id,shipping_address_id,chaild_fields)

我不小心从ADDRESS_TABLE中删除了大部分数据。

  1. ADDRESS_TABLE具有来自MAIN_TABLE的外键,即main_table_id。对于MAIN_TABLE中的每一行,ADDRESS_TABLE中都有两个条目,其中一个条目是其address_type为“计费/认”,而另一个条目则是针对address_type为“装运”。

  2. 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。

这些是我需要的东西。

  1. 我需要为MAIN_TABLE中的每个原始数据创建两个虚拟地址条目,一个是地址类型为“ billing / default”,另一个是地址类型为“ shipping”。
  2. 我需要将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 ();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。