Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про delete и fk / 15 сообщений из 15, страница 1 из 1
27.02.2018, 14:05
    #39607865
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Есть таблица A с полем A.id

Есть таблица B с полями id, header_id, a_id
Есть FK B.a_id => A.id

Нужно удалить записи из A запросом вида

delete from A where A.id in (select a_id from b where header_id=1);
update B set a_id=null where header_id=1;

но на delete срабатывает FK.

Можно ли такую тривиальную задачу решить SQL без временных таблиц и PL/SQL ?
...
Рейтинг: 0 / 0
27.02.2018, 14:13
    #39607870
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Leonid Kudryavtsevно на delete срабатывает FK.SET NULL?
...
Рейтинг: 0 / 0
27.02.2018, 14:13
    #39607871
n0rd1c.c0ld
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Leonid Kudryavtsev , on delete set null ?
...
Рейтинг: 0 / 0
27.02.2018, 14:14
    #39607873
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
понятно, что можно FK сделать ON DELETE SET NULL

Но потребность выглядит уж больно стандартной. Может я чего не доглядел и можно чисто SQL изобразить?
...
Рейтинг: 0 / 0
27.02.2018, 14:18
    #39607877
фк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Leonid KudryavtsevМожет я чего не доглядел и можно чисто SQL изобразить?
Использовать отложенную проверку ограничений?
...
Рейтинг: 0 / 0
27.02.2018, 14:29
    #39607892
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
DDL менять для выполнения простой операции в скрипте - как-то из пушки по воробьям
Написать PL/SQL цикл - не проблема

просто подумал, может есть какие-то хитрые команды типа MERGE ))), а я темный о них не знаю

Удалить из нескольких таблиц сразу вроде можно, а вот удалить и зачистить - не нашел
...
Рейтинг: 0 / 0
27.02.2018, 15:11
    #39607919
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Leonid KudryavtsevНо потребность выглядит уж больно стандартной.Ага. Для SET NULL.
Leonid KudryavtsevМожет я чего не доглядел и можно чисто SQL изобразить?Предпочитающие идти своим путём могут попробовать трюк навроде:
Код: plsql
1.
2.
update tab n set a_id = null where ... returning (select o.a_id from tab o where o.rowid = a.rowid) bulk collect into ...;
delete ...;
...
Рейтинг: 0 / 0
27.02.2018, 15:17
    #39607923
n0rd1c.c0ld
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Leonid KudryavtsevDDL менять для выполнения простой операции в скрипте - как-то из пушки по воробьям
А set constraint deferred ?
...
Рейтинг: 0 / 0
27.02.2018, 15:33
    #39607939
n0rd1c.c0ld
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
n0rd1c.c0ldLeonid KudryavtsevDDL менять для выполнения простой операции в скрипте - как-то из пушки по воробьям
А set constraint deferred ?
Глупость написал.
...
Рейтинг: 0 / 0
27.02.2018, 15:34
    #39607941
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
n0rd1c.c0ldLeonid KudryavtsevDDL менять для выполнения простой операции в скрипте - как-то из пушки по воробьям
А set constraint deferred ?

ORA-02447 cannot defer a constraint that is not deferrable

))) всюду грабли. Сделал на PL/SQL. Но спасибо за информацию. Ни про ON DELETE SET NULL, ни про SET DEFERRED не знал

Код: plsql
1.
2.
3.
4.
for c in (select....)
   update ...
   delete ..
end loop;
...
Рейтинг: 0 / 0
27.02.2018, 16:01
    #39607958
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
Leonid Kudryavtsev... запросом вида

delete from A where A.id in (select a_id from b where header_id=1);
update B set a_id=null where header_id=1;Выглядит некорректным, в после update в B могут остаться ссылки на A.

В предположении допущений по поводу критериев нужности записей A:
Код: plsql
1.
2.
update B set a_id=null where a_id in (select a_id from B where header_id=1);
delete from A where not exists (select 1 from B where B.a_id = A.id);
...
Рейтинг: 0 / 0
27.02.2018, 18:47
    #39608073
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
-2-,

не могу понять зачем IN?

update B set a_id=null where a_id in (select a_id from B where header_id=1);


.....
stax
...
Рейтинг: 0 / 0
27.02.2018, 19:23
    #39608099
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
да не зачем, просто copy-past не глядя )))
...
Рейтинг: 0 / 0
27.02.2018, 21:36
    #39608166
Вопрос про delete и fk
Staxне могу понять зачем IN?

update B set a_id=null where a_id in (select a_id from B where header_id=1);
сравни in (... header_id = 1) и непосредственный header_id = 1id a_id header_id101 10 0101 10 1
...
Рейтинг: 0 / 0
28.02.2018, 10:12
    #39608313
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про delete и fk
всего две строкиStaxне могу понять зачем IN?

update B set a_id=null where a_id in (select a_id from B where header_id=1);
сравни in (... header_id = 1) и непосредственный header_id = 1id a_id header_id101 10 0101 10 1

ясно, чет проморгал (ступил) етот момент

хотя, судя по первому посту, еще вопрос нужно ли ето Leonid-у Kudryavtsev-у

....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про delete и fk / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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