场景如以下步骤所述(这只是说明问题的一个示例)
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表之间存在真实的的关系。
我将非常感谢任何帮助-如果有人可以写的查询我将需要运行来解决这个问题。非常感谢。
1条答案
按热度按时间gudnpqoy1#
经过几次尝试,我能够实现将回答这个问题的函数-根据我上面描述的步骤。