Как удалить битые ссылки?

Здраствуйте.
В postgresql запросам не очень силен.Хотелось бы узнать, можно сделать следующее (с помощью запроса или скрипта)

Есть допустим табл Т1 у которой есть поле Р (bytea), которое имеет составной тип,т.е. может быть ссылкой на различные таблицы (Т2,Т3,Т4 и.т.д.).Если допустим в табл Т2 удалили запись , то в табл Т1 в поле Р останется запись на не сушествующую запись, нужно теперь почистить эту запись.Проблема в том что поле Р имеет составной тип :(

Я думаю что нужно сделать что-то типо этого или я не прав, может есть более оптимальный способ?

DELETE
FROM T1
WHERE P = типу табл. T2
AND P IS NULL

как можно сравнить типы в запросе?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Есть. Называется внешний

Есть. Называется внешний ключ: FOREIGN KEY
Таблицы связываются дополнительным полем ID и соответственно на него делается внешний ключ:
http://postgresql.ru.net/manual/ddl-constraints.html#DDL-CONSTRAINTS-FK

пример

делаю что-то типо этого но ничего не получается

SELECT 
  T1._idrref, 
  T2._idrref, 
 
FROM 
 T1, 
  T2
WHERE 
T1._idrref = T2._idrref 
AND
T2._idrref IS NULL ;

поля связываются но как мне написать условие что данных нет, что пустая ссылка??? :(

Нет, вы делаете не "что-то

Нет, вы делаете не "что-то типа этого". Почитайте документацию ещё раз. Написано предельно ясно и с примерами.

Если никак не осилить внешние

Если никак не осилить внешние ключи - можете попробовать использовать триггеры.
Собственно в ранних версиях PostgreSQL внешние ключи эмулировались триггерами.
Создаёте триггер для события DELETE на таблицу откуда будете удалять вашу запись и собственно выполняете необходимые действия по удалению из других таблиц в функции, которую вызовет этот триггер.

Случайно не 1С правите :)) ?

В 1С есть такие связи, приходилось работать. На самом деле это очень (ОЧЕНЬ) плохой стиль - связывать одно поле с несколькими таблицами. Если есть возможность менять структуру базы, лучше перейти к нормальной форме с внешними ключами.
Если я правильно понял, составное поле Р таблицы Т1 не обнуляется (not null), а указанному в нем ключу нет соответствующей записи в Т2.
Код должен быть примерно таким:

DELETE FROM T1
WHERE P = type of (T2)
    AND NOT EXISTS (SELECT * FROM T2 -- в Т2 не существует записей с ключем из Т1
             WHERE T1.p = T2.KEY)
 
DELETE FROM T1
WHERE P = type of (T3)
    AND NOT EXISTS (SELECT * FROM T3 -- в Т3 не существует записей с ключем из Т1
             WHERE T1.p = T3.KEY)

и т.п.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023