Здраствуйте.
В 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
пример
делаю что-то типо этого но ничего не получается
поля связываются но как мне написать условие что данных нет, что пустая ссылка???
Нет, вы делаете не "что-то
Нет, вы делаете не "что-то типа этого". Почитайте документацию ещё раз. Написано предельно ясно и с примерами.
Если никак не осилить внешние
Если никак не осилить внешние ключи - можете попробовать использовать триггеры.
Собственно в ранних версиях PostgreSQL внешние ключи эмулировались триггерами.
Создаёте триггер для события DELETE на таблицу откуда будете удалять вашу запись и собственно выполняете необходимые действия по удалению из других таблиц в функции, которую вызовет этот триггер.
Случайно не 1С правите :)) ?
В 1С есть такие связи, приходилось работать. На самом деле это очень (ОЧЕНЬ) плохой стиль - связывать одно поле с несколькими таблицами. Если есть возможность менять структуру базы, лучше перейти к нормальной форме с внешними ключами.
Если я правильно понял, составное поле Р таблицы Т1 не обнуляется (not null), а указанному в нем ключу нет соответствующей записи в Т2.
Код должен быть примерно таким:
и т.п.