我有一个多租户数据库。我的要求是从数据库中提取单个租户的数据并插入到其他数据库中。
所以我有两个表:用户和身份。users表具有外键identity_id与标识表相连接,可以有多个身份和用户下的一个客户。
我正在将数据提取到csv文件中,并从csv文件中插入新的数据库。主键被设置为自动增量,因此用户和标识表在从csv插入数据时生成id。
现有数据库中的表数据
用户表
| id | identity_id |
| --- | ------------|
| 86 | 70 |
| 193 | 127 |
| 223 | 131 |
恒等表
|id |name |email |
|---|------------|-----------------|
|70 |Alon muscle |muscle@test.com |
|131|james |james@james.com |
|127|watson |watson@watson.com|
现在,identity_id是用户表映射到标识表的外键。
我正在尝试将用户和标识数据插入到新的数据库中,这样用户和标识的主键就会自动递增。问题出在外键上。如何维护foreign_key关系,因为我有多个用户和身份记录?
发布于 2021-12-29 15:24:57
实际上,您没有提供表的详细信息,这将是实际的定义(ddl)。也不提供CVS内容,我假设您的stage表包含相同的内容。但是,通过提供测试数据和一些假设,下面将演示一个加载数据的方法。该方法是构建一个使用stage表加载identities
表的过程,然后从为填充users
表提供的电子邮件中选择生成id。假设:
identities
中必须是唯一的(至少在小写中是如此)。identities
的名称和电子邮件。过程来加载标识和用户。
create or replace procedure generate_user_idents()
language sql $
insert into identities(name, email)
select name, email
from stage
on conflict (low_email)
do nothing ;
as $$
insert into users(ident_id)
select ident.ident_id
from identities ident
where ident.low_email in
( select lower(email)
from stage
) ;
$$;
脚本来清除和重新填充阶段数据,然后将阶段加载到标识和用户。
do $$
begin
execute 'truncate table stage';
-- replace the following with your \copy to load stage
insert into stage(name, email)
values ( 'Alon muscle', 'muscle@test.com' )
, ( 'watson', 'watson@watson.com')
, ( 'james', 'james@james.com' );
call generate_user_idents();
end ;
$$;
见这里的演示。由于演示程序生成ids,所以它与提供的值不完全匹配,而是接近。就目前情况而言,如果您未能清除stage
表或将相同的值重新输入到该表中,则该过程将乐于生成重复项。你得决定怎么处理。
https://stackoverflow.com/questions/70509140
复制相似问题