意外检测到表中的所有数据,请使用循环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,main_table_id, shipping_address_id, chaild_fields)

我无意中删除了ADDRESS_TABLE中的大部分数据。

  1. ADDRESS_TABLE有一个来自MAIN_TABLE的外键,即MAIN_TABLE_id。对于MAIN_TABLE中的每一行,在ADDRESS_TABLE中有两个条目,其中一个条目是其ADDRESS_type是"0";计费/默认";而另一个条目用于address_type";运输";。

  2. CHAID_TABLE有两个外键,一个来自MAIN_TABLE,即MAIN_TABLE_id,另一个来自ADDRESS_TABLE,即shipping_addr_id。这个shipping_addr_id是address_TABLE的地址id,它的地址_type是shipping,address_TABLE.main_TABLE_id=CHAID_TABLE.main_TABLE_id.

这些是我需要的东西。

  1. 我需要为MAIN_ TABLE中的每个原始创建两个伪地址条目;计费/默认";另一种是";运输">
  2. 我需要将address_table_id插入到其address_table.main.table_id=CHAID_table.main_table_id.和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 ();

最新更新