Postgresql: извлечь одну запись со всеми ссылками FK - PullRequest
3 голосов
/ 05 апреля 2011

Я работаю с большой производственной базой данных postgresql. Иногда возникает необходимость отладки с использованием реальных производственных данных. Из-за размера базы данных нецелесообразно передавать весь дамп на наши рабочие станции разработки.

Есть ли способ, возможно, с использованием information_schema, извлечь отдельную запись, а также:

  • все записи, на которые ссылается эта запись, рекурсивно каскадно

  • все записи, которые относятся к этой записи (с предыдущим критерием, применяемым также к этим записям)


Возможно, лучше всего это проиллюстрировать на примере:


Если у нас есть следующие таблицы:

человек (от ФК до адресов)

Адреса (от ФК до городов)

Город

Сотрудники (fks to Employee_Types, People)

Employee_Types


Скажите, что я хочу "извлечь" конкретную запись из таблицы People. Я хотел бы получить:

(1) запись в Люди

(2) запись в адресах, на которые ссылается запись People в (1)

(3) запись в городах, на которую ссылается запись адреса в (2)

(4) любая запись сотрудников, которая ссылается на запись сотрудников в (1)

(5) записи Employee_Types, на которые ссылаются записи Employees, найденные в (4)


Есть идеи?

1 Ответ

1 голос
/ 05 апреля 2011

Создать таблицу переноса со всеми записями, связанными с этими лицами:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...