Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление записей из одной таблицы по ключам другой таблицы [D6, Sybase ASA]


Страницы:   1 2

Курдль ©   (2004-04-28 23:58:00) 

1. База построена криво, - не сыпьте соль на ...
2. Перепланировать ее нельзя никоим образом - ни процедур ни даже временных таблиц.

Описание:
Есть таблица СПРАВКИ ПК: СПР_ИД
Есть таблица ПЛАТЕЖИ, ссылающаяся на справки "одна-к-одной" по внешнему ключу ВК_СПР_ИД.
Теперь внимание! Вопрос: надо удалить те, и только те СПРАВКИ, на которые ссылается группа ПЛАТЕЖЕЙ.
Если кто не понял, проблема в том, что сначала надо обнулить значение внешних ключей из ПЛАТЕЖЕЙ, а потом удалить соответствующие обнуленнымключам справки.

Не предлагать:
1. Сделать селект и в цикле обнулять по одному сначала ключи (запоминая их значение), а потом удалять СПРАВКУ со СПР_ИД равной этому значению.
2. Предлагать все остальное :) Хотелось бы какой-нить шайтан скрипт :)


stud   (2004-04-29 10:37:00) [21]

так а запросом типа
delete from  spravki where spravki.spr_id in (select plategi.id from plategi inner join on (plategi.id=spravki.spr_id)
или что-то в этом роде?


Sandman25+1   (2004-04-29 10:37:00) [22]

[5] Курдль ©   (29.04.04 10:10)

Никакого вмешательства в БД нет.

В первом случае foreign key отключается только для текущей транзакции, в момент подтверждения/отката транзакции происходит автоматическе восстановление constraint и если он "violated", то commit не проходит.

Во втором случае создается temp table, которая существует только в текущем сеансе подключения и удаляется автоматически при его завершении.


DenK_vrtz   (2004-04-29 10:35:00) [23]

>Курдль ©

Если я правильно понял на одну справку имеется несколько платежей. Так? Если вы пытаетесь удалить справку, а у платежа занудить ссылку на справку, о каком внешнем ключе, в таком случае, может идти речь?
Исходя из Курдль ©   (29.04.04 10:10) [5]
>Нет никаких прав для вмешательства в структуру БД
задача может быть решена путем создания каких-нить, скажем, временных локальных таблиц, в которые будет закачена, а потом восстановлена нужная информация. Но вопрос о сохранении внешнего ключа остается открытым.


Johnmen   (2004-04-29 10:34:00) [24]

>Курдль ©   (29.04.04 10:10) [5]

Тогда это уже не один-к-одному, а один-ко-многим. В общем случае...

Попробуй
DELETE FROM СПРАВКИ
WHERE EXISTS (SELECT 0 FROM ПЛАТЕЖИ
             WHERE ПЛАТЕЖИ.ВК_СПР_ИД=СПРАВКИ.СПР_ИД)


Курдль   (2004-04-29 10:10:00) [25]

Для Johnmen

> Что есть "группа" ПЛАТЕЖЕЙ ? И какой однозначный критерий
> "ссылается" ?

"Группа" - один, или несколько платежей, например, порожденных одним и тем же отчетом.
Критерий "ссылается" - имеет внешний ключ по СПР_ИД, как описано в [0]
Для Sandman25+1
1, 2: Нет никаких прав для вмешательства в структуру БД, как описано в [2] п.4.


Sandman25+1   (2004-04-29 09:48:00) [26]

1. Если в Sybase есть способ временно отключить Foreign Key, то можно так и сделать, а потом в лоб - сначала удалить нужные справки, потом очистить платежи, которые ссылаются на только что удаленные (и потому несуществующие уже) справки.

2. Если способ 1 невозможен, то можно закачать номера нужных справок в новую временную таблицу, а затем двумя командами очистить платежи и удалить справки, используя эту новую временную таблицу в подселекте в обеих командах. Если временная табличка будет большая, то можно еще и индекс по ней создать для ускорения.


Johnmen   (2004-04-29 09:19:00) [27]

>Вопрос: надо удалить те, и только те СПРАВКИ, на которые
>ссылается группа ПЛАТЕЖЕЙ.

Что есть "группа" ПЛАТЕЖЕЙ ? И какой однозначный критерий "ссылается" ?


Курдль   (2004-04-29 09:09:00) [28]


> Может всё-таки "один-ко-многим". Иначе ВК_СПР_ИД - PrimaryKey
> field, которое не может быть NULL

1. C какого это перепугу? :) У Вас, например, легально может быть только один паспорт. И может быть один, или ни одного загранпаспорта. Предположим, что Вам интересно иметь ссылку именно с паспорта на загранпаспорт - вот она и будет "внешний ключ один-к-одному", причем не обязательный!

> можно удалить все записи из СПРАВКИ, на которые нет ссылок
> из ПЛАТЕЖЕЙ

2. Так тоже нельзя, т.к. СПРАВКИ живут своей полной приключений жизнью, могут создаваться на рабочих местах другого типа и закономерно не иметь никаких отношений с ПЛАТЕЖАМИ. Однако, это не повод, чтобы их удалять.

3. Есть маленькая надежда добиться права альтернуть внешний ключ со свойством check on commit, но весьма призрачная.

4. Создать View или Temporary Table не дают привелегии пользователя.


ЮЮ   (2004-04-29 02:48:00) [29]

>ссылающаяся на справки "одна-к-одной" по внешнему ключу ВК_СПР_ИД

Может всё-таки "один-ко-многим". Иначе ВК_СПР_ИД - PrimaryKey field, которое не может быть NULL

> а потом удалить соответствующие обнуленным ключам справки.
после обнуления не будет соответствия, поэтому можно удалить все записи из СПРАВКИ, на которые нет ссылок из ПЛАТЕЖЕЙ, при условии, конечно, что не должно быть таких справок, а они существуют лишь благодаря "кривизне" структуры БД


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо