Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / таблица ключей / 16 сообщений из 16, страница 1 из 1
20.01.2015, 14:45
    #38858530
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
подскажите в какой сист. таблице хранятся данные о том с какими другими таблицами и полями установлены связи?
...
Рейтинг: 0 / 0
20.01.2015, 14:54
    #38858544
/\/\/\/\/\/\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
Legushka,
RTFM
Ваш вопрос найдете тут и тут .
...
Рейтинг: 0 / 0
20.01.2015, 15:02
    #38858552
li_malina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
Legushka,
pg_constraint
...
Рейтинг: 0 / 0
20.01.2015, 15:16
    #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
20.01.2015, 15:20
    #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
20.01.2015, 15:32
    #38858590
/\/\/\/\/\/\
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
Legushka,
Читайте RTFM . Затем по имени органичения находите таблицу, где оно задано.
...
Рейтинг: 0 / 0
20.01.2015, 16:17
    #38858647
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
сформулирую точнее что именно надо найти:
оооочень большая таблица, из нее надо найти все неиспользованные записи и отдельно их переместить в другую таблицу мусора

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

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

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

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

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

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

Тогда нужно действительно разобраться с постановкой задачи. Как ни крути, разобираться с предметной областью (то есть откуда и почему на эту таблицу ссылаются, почему ее нужно чистить и что будет, если не почитсят) придется. Никуда не денешься.
...
Рейтинг: 0 / 0
21.01.2015, 07:33
    #38859153
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
вы правы,там есть каскады. и целая туча других связанных таблиц. и записей милионы. поэтому нужен авто запрос по ключ ам
...
Рейтинг: 0 / 0
21.01.2015, 08:09
    #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
21.01.2015, 08:26
    #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
21.01.2015, 09:28
    #38859243
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
таблица ключей
/\/\/\/\/\/\
спасибо большущее. это уже прочный фундамент для того что мне нужно.
...
Рейтинг: 0 / 0
21.01.2015, 10:29
    #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
Период между сообщениями больше года.
04.07.2016, 16:14
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / таблица ключей / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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