172 похожих чатов

Есть таблица T1, и ещё N таблиц, которые являются дочерними

и/или "внучатыми" по отношению к T1, с "on delete cascade". При этом эти дочерние/внучатые таблицы друг на друга ещё ссылаются, "on delete restrict".
Ну например так:
T1 <- A <- B <- C — все связи cascade
T1 <- D — тоже cascade
C -> D — restrict

можно ли ожидать, что при удалении записи из T1 PG разберётся со всеми связими, сделает топологическую сортировку и удалит весь этот вложенный зоопарк в правильном порядке?

14 ответов

7 просмотров

Хмм... а почему нет (если "зоопарк" можно удалить, т.е. restrict не мешают)? Можно же попробовать на конкретном примере, хотя бы...

Ilya-Portnov Автор вопроса
Yaroslav Schekin
Хмм... а почему нет (если "зоопарк" можно удалить,...

похоже не, не умеет PG топологическую сортировку :/ https://gist.github.com/portnov/a58596ce86b68e81e623df6515d59781 https://sqlize.online/sql/psql15/52d62221f1ee706fc8a1e7b9e0752b07/

Ilya-Portnov Автор вопроса
Yaroslav Schekin
Хмм... а почему нет (если "зоопарк" можно удалить,...

т.е. оно сначала пытается удалить из D. Ну хз почему, захотелось так.

Ilya Portnov
похоже не, не умеет PG топологическую сортировку :...

> похоже не, не умеет PG топологическую сортировку :/ А вот должен ли он, я сходу не скажу... Хмм... а это в каких-то других СУБД удаляет все записи (а с NO ACTION какое поведение)?

Ilya-Portnov Автор вопроса
Yaroslav Schekin
> похоже не, не умеет PG топологическую сортировку...

https://sqlize.online/sql/oracle21/92285cd4e5627905f45bb17ff0327202/ на оракле работает.

Ilya Portnov
https://sqlize.online/sql/oracle21/92285cd4e562790...

Хмм... а точно: -- on delete restrict is oracle's default ? Это нарушает ISO SQL, я вот к чему (default должен быть NO ACTION ).

Ilya-Portnov Автор вопроса
Ilya-Portnov Автор вопроса
Yaroslav Schekin
Хмм... а точно: -- on delete restrict is oracle's ...

Oracle allows three different definitions under the definition of the foreign key: ON DELETE CASCADE (when a referenced parent table row is removed all the child are removed automatically) The ON DELETE SET NULL action allows data that references the parent key to be deleted, but not updated. When referenced data in the parent key is deleted, all rows in the child table that depend on those parent key values have their foreign keys set to null. ON DELETE NO ACTION (which is the default) prevents deleting a parent when there are children (would be nice arrangement for real life) так, а чем restrict от no action отличается?... в PG — похоже, ничем: если я в примере выше заменяю, ничего не меняется.

Ilya Portnov
Oracle allows three different definitions under th...

> ON DELETE NO ACTION (which is the default) Т.е. default правильный, а RESTRICT нет? > так, а чем restrict от no action отличается? "NOTE 72 — Even if constraint checking is not deferred, ON DELETE RESTRICT is a stricter condition than ON DELETE NO ACTION. ON DELETE RESTRICT prohibits a delete of a particular row if there are any matching rows; ON DELETE NO ACTION does not perform its constraint check until the entire set of rows to be deleted has been processed." © sql:2016 > в PG — похоже, ничем: если я в примере выше заменяю, ничего не меняется. Да, я тоже заметил. А вот правильно ли это — сходу не скажу (надо копаться в стандарте).

Ilya-Portnov Автор вопроса
Yaroslav Schekin
> ON DELETE NO ACTION (which is the default) Т.е...

да, в оракле нет on delete restrict.

Ilya Portnov
похоже не, не умеет PG топологическую сортировку :...

(Я тут обсудил это с некоторыми contributors) Вы могли бы написать bug report (да, на всякий случай — код repro должен быть в самом report / e-mail, а не ссылкой куда-то — а то они "протухают" N лет спустя, и архивы читать нормально не получается)?

Ilya-Portnov Автор вопроса
Yaroslav Schekin
(Я тут обсудил это с некоторыми contributors) Вы м...

хм, я не против написать репорт, только надо разобраться, куда именно :)

Ilya Portnov
хм, я не против написать репорт, только надо разоб...

Либо в -bugs, либо прямо вот так: https://www.postgresql.org/account/submitbug/

Ilya-Portnov Автор вопроса
Yaroslav Schekin
Либо в -bugs, либо прямо вот так: https://www.post...

юзайте deferrable initially deferred, говорят :)

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Утра доброго. Просветите пожалуйста. Хочу сделать rest сервер на делфи. Посмотрел 3 фреймворка: dmvc, Mars, mormot. Ни в одном из них не упоминается ассинхронная обработка вхо...
Сергей Бычков
10
Как попросить stack install делать executable без .exe на винде?
Danila Danko
9
Карта сайта