postgresql:使用所有fk引用提取单个记录

时间:2011-04-05 14:28:00

标签: sql postgresql

我使用大型postgresql生产数据库。偶尔需要使用实际生产数据进行调试。由于数据库的大小,将整个转储传输到我们的开发工作站是不切实际的。

是否有办法(可能使用information_schema)提取单个记录,以及:

  • 此记录引用的所有记录,递归级联

  • 所有引用此记录的记录(以前的标准也适用于这些记录)


也许最好用一个例子说明:


如果我们有以下表格:

人(fk to Addresses)

地址(fk到城市)

城市

员工(fks to Employee_Types,People)

Employee_Types


假设我想在People表中“提取”特定记录。我想得到:

(1)人物中的记录

(2)(1)

中People记录引用的地址中的记录

(3)由(2)

中的地址记录引用的城市记录

(4)任何涉及(1)

中人员记录的员工记录

(5)在(4)中找到的Employees记录引用的Employee_Types记录


有什么想法吗?

1 个答案:

答案 0 :(得分:1)

创建一个包含与这些人相关的所有记录的转移表:

select 
    c.name as city_name, c.id as city_id,
    a.street, a.zip,
    et.type, et.type_id,
    p.id as people_id, p.name,
    e.id as employee_id, e.people_id as employee_people_id, e.type_id as employee_type_id
into transfer
from People p
inner join Addresses a on p.zip = a.zip
inner join Cities c on a.city_id = c.id
inner join Employees e on p.id = e.people_id
inner join Employee_Type et on et.id = e.type_id
where p.id in (@people_id_1, @people_id_2)

然后在命运插入到各个表中,注意正确的顺序以避免外键错误:

insert into Cities (name, id)
select distinct city_name, city_id
from transfer

insert into Addresses (street, zip)
select distinct street, zip
from transfer

insert into People (id, name)
select distinct people_id, name
from transfer

insert into Employee_Type (type, id)
select distinct type, type_id
from transfer

insert into Employees (id, people_id, type_id)
select distinct employee_id, employee_people_id, employee_type_id
from transfer