powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / таблица ключей
16 сообщений из 16, страница 1 из 1
таблица ключей
    #38858530
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите в какой сист. таблице хранятся данные о том с какими другими таблицами и полями установлены связи?
...
Рейтинг: 0 / 0
таблица ключей
    #38858544
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka,
RTFM
Ваш вопрос найдете тут и тут .
...
Рейтинг: 0 / 0
таблица ключей
    #38858552
li_malina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka,
pg_constraint
...
Рейтинг: 0 / 0
таблица ключей
    #38858572
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо из РТФМ вытащил нужную таблицу
SELECT conname, connamespace, contype, condeferrable, condeferred, convalidated,
conrelid, contypid, conindid, confrelid, confupdtype, confdeltype,
confmatchtype, conislocal, coninhcount, conkey, confkey, conpfeqop,
conppeqop, conffeqop, conexclop, conbin, consrc
FROM pg_constraint
where conname='fk_table_z'

и в таблице у меня
CONSTRAINT fk_table_z FOREIGN KEY (pole_az_id)
REFERENCES blablabla.AZZ (az_id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,

подскажите как можно найти все таблице и поля которые ссылаются на мою текущую blablabla.AZZ
...
Рейтинг: 0 / 0
таблица ключей
    #38858578
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на просторах нашел такую тему которая мне пригодится)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
  schemaname,
  tablename,
  indexname,
  indexdef
FROM
  pg_indexes
WHERE
  tablename = 'моя таблица' --AND schemaname = 'myschema'
...
Рейтинг: 0 / 0
таблица ключей
    #38858590
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka,
Читайте RTFM . Затем по имени органичения находите таблицу, где оно задано.
...
Рейтинг: 0 / 0
таблица ключей
    #38858647
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сформулирую точнее что именно надо найти:
оооочень большая таблица, из нее надо найти все неиспользованные записи и отдельно их переместить в другую таблицу мусора

в БД очень много зависимостей Foreign Key
которые ссылаются на текущую, как можно найти из текущей таблицы все записи которые не встречаются ни в одной связи Foreign Key которые ссылаются на текущую таблицу
...
Рейтинг: 0 / 0
таблица ключей
    #38858982
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka,

Сделайте тупо и примитивно:
За одну транзакцию:
1. Берете запись, копируете ее в мусорную таблицу
2. Удаляете запись из основной таблицы.
Если удалось удалить - все хорошо. Ее ничего не держит.
Не удалось удалить - транзакция откатится к исходному состоянию. Больше эту запись не трогаете.
И так по всем записям в таблице.

То что это все будет делаться не очень быстро - не беда. Нужно всего лишь немного подождать. Неделя-другая - не срок.
...
Рейтинг: 0 / 0
таблица ключей
    #38859080
йоксель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/\/\/\/\/\/\,

не учите плохому. там могут быть не [ON DELETE RESTRICT] а [ON DELETE CASCADE].

и через неделю другую в базе будет пусто
от слова совсем
...
Рейтинг: 0 / 0
таблица ключей
    #38859152
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
йоксель,

Подумаешь, одной базой больше, одной меньше...
А заводы стоят!

Тогда нужно действительно разобраться с постановкой задачи. Как ни крути, разобираться с предметной областью (то есть откуда и почему на эту таблицу ссылаются, почему ее нужно чистить и что будет, если не почитсят) придется. Никуда не денешься.
...
Рейтинг: 0 / 0
таблица ключей
    #38859153
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы правы,там есть каскады. и целая туча других связанных таблиц. и записей милионы. поэтому нужен авто запрос по ключ ам
...
Рейтинг: 0 / 0
таблица ключей
    #38859169
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka,

Пробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH
tt01 AS (
SELECT
  t2.relname AS detail_table,
  substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES (.*)\(') AS master_table
FROM pg_catalog.pg_constraint t1
LEFT JOIN pg_catalog.pg_class t2 ON t2.oid = t1.conrelid
WHERE t1.contype IN ('f')
)

SELECT
  *
FROM tt01
WHERE master_table LIKE '%table_name%'
ORDER BY 2, 1
...
Рейтинг: 0 / 0
таблица ключей
    #38859182
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka,

Или так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  t2.relname AS detail_table,
  substring(pg_get_constraintdef(t1.oid) FROM 'FOREIGN KEY \((.*)\) REFERENCES') AS detail_field_list,
  substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES (.*)\(') AS master_table,
  substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES .*\((.*)\)') AS master_field_list
FROM pg_catalog.pg_constraint t1
LEFT JOIN pg_catalog.pg_class t2 ON t2.oid = t1.conrelid
WHERE t1.contype IN ('f')

...
Рейтинг: 0 / 0
таблица ключей
    #38859243
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\
спасибо большущее. это уже прочный фундамент для того что мне нужно.
...
Рейтинг: 0 / 0
таблица ключей
    #38859319
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот кусочек домика на фундаменте (повырезал все лишнее и заменил наименования, может комунить пригодится)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
  sh.nspname||'.'||t2.relname AS detail_table,
  substring(pg_get_constraintdef(t1.oid) FROM 'FOREIGN KEY \((.*)\) REFERENCES') AS detail_field_list,
  substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES (.*)\(') AS master_table,
  substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES .*\((.*)\)') AS master_field_list,
  'union select p.pole_ID from pp.TableA p inner join  '||sh.nspname||'.'||t2.relname||' t on t.'||substring(pg_get_constraintdef(t1.oid) FROM 'FOREIGN KEY \((.*)\) REFERENCES')||'=p.pole_ID'
  
FROM pg_catalog.pg_constraint t1
LEFT JOIN pg_catalog.pg_class t2 ON t2.oid = t1.conrelid
left join pg_catalog.pg_namespace sh on t2.relnamespace=sh.oid

WHERE t1.contype IN ('f')
	and substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES (.*)\(') = 'pp.TableA'
	order by t2.relname



заменить pp.TableA и p.pole_ID на свои значения-)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
таблица ключей
    #39267485
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дополнил для себя, может еще кому нить пригодится
поиск существующих связей между двумя таблицами по FK
работает в направлении от мастер_таблицы Table_A<-Table_B<-Table_C<-Table_D



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
with recursive 
	param (master, slave) as (values ('Table_A'::name, 'Table_D'::name)),
	t0   as (
	WITH
		tt01 AS (
		SELECT
		t2.relname AS detail_table,
		substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES (.*)\(') AS master_table
		FROM pg_catalog.pg_constraint t1
		LEFT JOIN pg_catalog.pg_class t2 ON t2.oid = t1.conrelid
		WHERE t1.contype IN ('f')
	)
	SELECT
	tt01.*, (master_table::ltree)||detail_table as ltree ,1 as levell, true as usl
	FROM param join tt01 on master_table LIKE '%'||param.master||'%'
	
	
	union all
	select 	t2.*, t0.ltree||t2.detail_table, t0.levell+1, case when t2.detail_table = slave then false else true end
	from 	param join t0 on true join lateral  
		(
			WITH
			tt01 AS (
			SELECT
			t2.relname AS detail_table,
			substring(pg_get_constraintdef(t1.oid) FROM 'REFERENCES (.*)\(') AS master_table
			FROM pg_catalog.pg_constraint t1
			LEFT JOIN pg_catalog.pg_class t2 ON t2.oid = t1.conrelid
			WHERE t1.contype IN ('f')
		)
		SELECT
		*
		FROM tt01
		WHERE master_table LIKE t0.detail_table
			and t0.levell<4 
			and t0.usl
		)t2 on true
	)
select detail_table, master_table, ltree, levell from param join t0 on ltree @ slave::ltxtquery
group by detail_table, master_table, ltree, levell 
order by ltree 
limit 20
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / таблица ключей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]