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

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

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

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

14 ответов

24 просмотра

Хмм... а почему нет (если "зоопарк" можно удалить, т.е. 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 Автор вопроса
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, говорят :)

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта