postgresql 将数据从一个表复制到另一个由计算变量和特定列组合的现有表

dpiehjr4  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(165)

场景如以下步骤所述(这只是说明问题的一个示例)
1.数据库中有两个表(user_1、post_1)-它们之间没有真实的关系
user_1包含以下字段:

id VARCHAR,   
  name VARCHAR,  
  address TEXT,  
  phone_number VARCHAR,  
  PRIMARY KEY (id)

post_1包含以下字段:

id VARCHAR,   
  user_id VARCHAR,  
  title VARCHAR,  
  body TEXT,  
  PRIMARY KEY (id)

1.假设我将以下数据添加到上面的两个表中:

INSERT INTO user_1(id, name, address, phone_number) VALUES ('first_u', 'avi', 'some address', '05488789906');

 INSERT INTO post_1(id, user_id, title, body) VALUES ('first_p', 'first_u', 'new post', 'This is a good one!');

1.现在,我已经创建了一些新表,这些表只做了少量更改,并且在它们之间建立了链接:
user_2包含以下字段:

id uuid DEFAULT uuid_generate_v4(),   
  name VARCHAR,  
  address TEXT,  
  phone_number VARCHAR,  
  PRIMARY KEY (id)

post_2包含以下字段:

id uuid DEFAULT uuid_generate_v4(),   
  user_id uuid,  
  title VARCHAR,  
  body TEXT,  
  PRIMARY KEY (id),
  CONSTRAINT fk_user FOREIGN KEY(user_id) REFERENCES user_2(id)

1.现在的问题是将数据复制到两个新表中,并在它们之间建立真实的的链接(外键)。我将解释一下-它分为几个部分:
a.计算user_1表中的行数(我已经为此创建了一个函数):

CREATE OR REPLACE FUNCTION rowsnumber() RETURNS INTEGER AS $$
DECLARE
numberOfRows integer;
BEGIN
        SELECT COUNT(*) INTO numberOfRows FROM (
                    SELECT *
                    FROM user_1
            ) t;

RETURN numberOfRows;
END;
$$ LANGUAGE plpgsql;

B.遍历for循环中的函数结果,并执行以下操作:

  • (b.1)根据for循环中的当前索引从user_1表中提取行号x(可以通过使用limit和offset来实现这一点)。
  • (b.2)将行数据插入到user_2表中。
  • (b.3)提取新创建的uuid并将其保存在参数中。
  • (b.4)根据post_1表的user_id列中存储的当前行的id列,从post_1表中检索适当的行。
  • (b.5)将我们在阶段(b.4)中提取的行的适当数据插入到post_2表中,但带有我们在步骤(b.3)中提取的user_id,以便在post_2表和user_2表之间存在真实的的关系。

我将非常感谢任何帮助-如果有人可以写的查询我将需要运行来解决这个问题。非常感谢。

gudnpqoy

gudnpqoy1#

经过几次尝试,我能够实现将回答这个问题的函数-根据我上面描述的步骤。

CREATE OR REPLACE FUNCTION insertToTables() RETURNS VOID AS $$
DECLARE
numOfRowsInTable integer := rowsnumber();
newRow record;
userUUIDRow record;
postRow record;
BEGIN
         for r in 0..numOfRowsInTable-1
         loop
           SELECT * INTO newRow FROM user_1 LIMIT 1 OFFSET r;
           INSERT INTO user_2(name, address, phone_number) SELECT newRow.name,newRow.address, newRow.phone_number ;
           SELECT * INTO userUUIDRow FROM user_2 ORDER BY created_at DESC LIMIT 1;
           SELECT * INTO postRow FROM post_1 WHERE user_id = newRow.id;
           INSERT INTO post_2(user_id, title, body) SELECT userUUIDRow.id, postRow.title, postRow.body;
         end loop;
END;
$$ LANGUAGE plpgsql;

相关问题