powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Ошибка при попытке создания foreign key в IBExpert
55 сообщений из 55, показаны все 3 страниц
Ошибка при попытке создания foreign key в IBExpert
    #33549171
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При попытке выполнения следующего кода
Код: plaintext
1.
2.
3.
4.
5.
alter table WAREH
add constraint FK_WAREH
foreign key (PARENTID)
references WAREH(ID)
on delete CASCADE
on update CASCADE
в IBExpert выкидывает такую ошибку
Невозможно подтвердить транзакцию:
violation of FOREIGN KEY constraint "".
violation of FOREIGN KEY constraint "***unknown***" on table "WAREH".
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549201
Amris Mirddin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так не может его создать потому как прям в процессе создания находятся записи, ему не соответствующие. А имени ключа назвать не может потому как ещё не создал :)
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549210
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Amris MirddinНу так не может его создать потому как прям в процессе создания находятся записи, ему не соответствующие. А имени ключа назвать не может потому как ещё не создал :)
Это как-то лечиться?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549220
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WWWovan Amris MirddinНу так не может его создать потому как прям в процессе создания находятся записи, ему не соответствующие . А имени ключа назвать не может потому как ещё не создал :)
Это как-то лечиться?

какое слово тебе непонятно?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549238
Amris Mirddin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WWWovan
Это как-то лечиться?

Ручаться не могу, но вообще-то психиатрия, особенно на Западе, в последнее время достигает неплохих результатов.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549248
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
srf2000

какое слово тебе непонятно?
Слова, то понятны все. Не понятно как исправить положение...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549254
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Amris Mirddin
Ручаться не могу, но вообще-то психиатрия, особенно на Западе, в последнее время достигает неплохих результатов.
Смешно. :-) Но мне бы все-таки хотелось исправить ошибку...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549264
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Но мне бы все-таки хотелось исправить ошибку...
привести данные в соответсвие с желаемой схемой.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549296
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kull Damned>
привести данные в соответсвие с желаемой схемой.

Тогда может посоветуете как? Несоответствие(если я правильно понял) состоит в наличие в поле PARENTID значения "0", которое отсутствует в ID...
"0" - это корень дерева...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549307
Dimano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[/quot]
Тогда может посоветуете как? Несоответствие(если я правильно понял) состоит в наличие в поле PARENTID значения "0", которое отсутствует в ID...
"0" - это корень дерева...[/quot]
Так и заведи значение "0" - "Корень дерева" или "Не указано" или ...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549318
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimano
Так и заведи значение "0" - "Корень дерева" или "Не указано" или ...[/quot]
Спасибо. Помогло... Я в пинципе и сам так подумал... но боялся что при такй вставке возникнут проблемы в других местах... Сейчас посмотрим..
Всем спасибо за помощь.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549365
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И боязнь была не напрасной... Проблемы возникли...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549483
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все разобрался. Извините за безпокойство.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549492
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно для корня дерева PARENTID устанавливают в NULL

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549563
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще обычней не делают on update/delete cascade :-) в общем, я не знаю тонкостей, и уже давно древовидными структурами не занимался, но мнится мне, что не надо бы каскадное обновление-удаление на деревянную структуру.
Тем более, что update cascade само по себе порочно и наказуемо.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549628
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно для корня дерева PARENTID устанавливают в NULL

кстати, нафига, позволю себе спросить? Конечно, это дело вкуса и все такое, использовать null или 0 как parent у корневых элементов. Но как бы, нет null - нет гемора. Не так ли?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549651
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жалко что редактировать свои сообщения нельзя.
я уже озвучивал ситуацию с этими null.

1. если делать fk, то parentid не может указывать на 0, если нет записи
id = 0 parentid = 0.
2. запись id = 0 parentid=0 фактически "зацикл". если не учитывать id > 0 то могут быть проблемы при переборе дерева.
3. parentid = null позволяет построить fk с id на parentid. НО. parentid не должен быть объявлен как not null.
4. при выборке корневых элементов надо писать where parent_id is null, в то время как для всех остальных - where parentid = :param.

лично мне не нравятся пункты 3 и 4. в системах делал parentid = 0, проблем не имел.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549688
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изначально все началось с необходимости изменять свойства группы(ID) вместе со всеми подгруппами. Для этого необходимо извлечь из списка все узлы некоторого поддерева.
Информация которая меня натолкнула на такие подвиги находиться в статье
_http://gsbelarus.com/gs/modules.php?name=News&file=article&sid=314

Первый метод из тех которые там описаны наиболее подходящий для моей базы.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549733
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнеобходимости изменять свойства группы(ID) вместе со всеми подгруппами

я не понял, при чем тут update cascade.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549744
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv

я не понял, при чем тут update cascade.
update cascade используеться в решение которое приведенов в статье(ссылка выше). Вот я и делал согласно предложеному в статье варианту...
Если есть решение лучше - буду очень благодарен...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549789
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть думать самостоятельно не хочется. Copy/Paste?

что такое ON UPDATE CASCADE в FK? Это автоматическое обновление столбца связи у деталей (в данном случае parentid) при изменении первичного ключа мастера.

Кто в здравом уме меняет значение первичного ключа у записей? Почти никто.

что такое ON DELETE CASCADE в FK? это автоматическое удаление деталей (в данном случае записей с parentid) при удалении записи в мастере.

Кто разрешает автоматически удалять детали при удалении мастера? Да почти никто. Уж слишком опасная эта штука. Причем зачастую бессмысленная.
Допустим, мы поставим авто-удаление между таблицами заказы-клиенты. Значит, при удалении клиента удалятся все заказы? Зашибись. То есть, отчет по продажам мы уже правильно не сформируем.
В ряде систем и удаления-то нет как такового. Только "пометка на удаление", или "виртуальное удаление".

В случае дерева, каскадное удаление означает вообще супер-удаление, то есть гроханье всей ветки от корня до листьев. Как представил, меня аж тряхнуло... :-)
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549921
WWWovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvто есть думать самостоятельно не хочется. Copy/Paste?

что такое ON UPDATE CASCADE в FK? Это автоматическое обновление столбца связи у деталей (в данном случае parentid) при изменении первичного ключа мастера.

Кто в здравом уме меняет значение первичного ключа у записей? Почти никто.

что такое ON DELETE CASCADE в FK? это автоматическое удаление деталей (в данном случае записей с parentid) при удалении записи в мастере.

Кто разрешает автоматически удалять детали при удалении мастера? Да почти никто. Уж слишком опасная эта штука. Причем зачастую бессмысленная.
Допустим, мы поставим авто-удаление между таблицами заказы-клиенты. Значит, при удалении клиента удалятся все заказы? Зашибись. То есть, отчет по продажам мы уже правильно не сформируем.
В ряде систем и удаления-то нет как такового. Только "пометка на удаление", или "виртуальное удаление".

В случае дерева, каскадное удаление означает вообще супер-удаление, то есть гроханье всей ветки от корня до листьев. Как представил, меня аж тряхнуло... :-)
Послушавшись Вашего совета, вообще удалил FK и запись с значениями 0 - 0(точнее 0 - 364 как я ее потом изменил)... То что нужно все равно работает!
Спасибо за дельные советы!
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33549996
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvчто такое ON UPDATE CASCADE в FK? Это автоматическое обновление столбца связи у деталей (в данном случае parentid) при изменении первичного ключа мастера.

Кто в здравом уме меняет значение первичного ключа у записей? Почти никто.

Использовал этот фокус для проверки и обновления значения копии поля мастера, дублирующегося у детали.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE TABLE1 (
  ID1 INTEGER,
  FIELD1 INTEGER
);

CREATE TABLE TABLE2 (
  ID2 INTEGER,
  ID1_REF INTEGER,
  FIELD1_COPY INTEGER
);

ALTER TABLE TABLE2 ADD CONSTRAINT FK_TABLE1 FOREIGN KEY (ID1_REF, FIELD1_COPY)
REFERENCES TABLE1 (ID1, FIELD1) ON UPDATE CASCADE;
Так как ID1 никогда не меняется, то FK гарантирует равенство копии поля оригиналу. Обновление можно, конечно, и на триггерах, но если есть удобная фишка, то трудно заставить себя ее не использовать, тем более, когда не понимаешь, почему нельзя. Вот же он, локоть, надо только дотянуться и укусить...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550053
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sextonто трудно заставить себя ее не использовать, тем более, когда не понимаешь, почему нельзя.

первичный ключ могут менять только если он "естественный". Если он "искуственный" (или суррогатный), то его меняют разве что в экстренных случаях, и обычно вручную, а не из клиентских приложений. Так что и про "обновление, конечно, можно и на триггерах" я того же мнения.
Я пытаюсь донести мысль, что искуственный ПК не меняют, независимо от того, ссылается на него кто-нибудь, или нет.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550150
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
первичный ключ могут менять только если он "естественный". Если он "искуственный" (или суррогатный), то его меняют разве что в экстренных случаях, и обычно вручную, а не из клиентских приложений. Так что и про "обновление, конечно, можно и на триггерах" я того же мнения.
Я пытаюсь донести мысль, что искуственный ПК не меняют, независимо от того, ссылается на него кто-нибудь, или нет.
Безусловно. В моем примере ID1 является искуственным неизменяемым ключем, а FIELD1 обычным (не ключевым) не пустым (not NULL забыл) изменяемым полем.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550358
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"kdv" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2363797@sql.ru...
> 3. parentid = null позволяет построить fk с id на parentid. НО.
parentid не должен быть объявлен как not null.
> 4. при выборке корневых элементов надо писать where parent_id is
null, в то время как для всех остальных - where parentid = :param.

при выборе надо писать where coalesce(parentid,0) = :param


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550377
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, protector!
Ты пишешь:

protectorp> при выборе надо писать where coalesce(parentid,0) = :param
Чтоб получить PLAN NATURAL, да, именно так и нужно писать.

--
With best regards, Мимопроходящий.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550387
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"kdv" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2364007@sql.ru...
> то есть думать самостоятельно не хочется. Copy/Paste?
>
> что такое ON UPDATE CASCADE в FK? Это автоматическое обновление
столбца связи у деталей (в данном случае parentid) при изменении первичного
ключа мастера.
>
> Кто в здравом уме меняет значение первичного ключа у записей? Почти
никто.
>
> что такое ON DELETE CASCADE в FK? это автоматическое удаление
деталей (в данном случае записей с parentid) при удалении записи в мастере.
>
> Кто разрешает автоматически удалять детали при удалении мастера? Да
почти никто. Уж слишком опасная эта штука. Причем зачастую бессмысленная.
Допустим, мы поставим авто-удаление между таблицами заказы-клиенты. Значит,
при удалении клиента удалятся все заказы? Зашибись. То есть, отчет по
продажам мы уже правильно не сформируем.

Борьба с каскадными ключами продолжается?

Автоматическое удаление детали у мастера значительно упрощает логику, когда
мастер+детали представляют собой связанный неразрывный объект. Например
трансформатор. У него есть обмотки вводы, автотрансформаторы, и т.д которые
тоже представляют из себя сложные сущности. И если удалить мастер и не
удалить детали, то получится полная ернда. Здесь удаление мастера ВСЕГДА
должно влечь за собой удаление деталей. Так зачем мучиться и удалять 100
записей, когда можно удалить 1 и положиться на внешний ключ.
В этом плане пример с заказами некорректен. Заказ не является ЧАСТЬЮ
клиента, а только связан с ним определённым образом. Это всё равно что
сделать каскадный FK на справочник.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550398
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector
Автоматическое удаление детали у мастера значительно упрощает логику, когда
мастер+детали представляют собой связанный неразрывный объект. Например
трансформатор. У него есть обмотки вводы, автотрансформаторы, и т.д которые
тоже представляют из себя сложные сущности. И если удалить мастер и не
удалить детали, то получится полная ернда. Здесь удаление мастера ВСЕГДА
должно влечь за собой удаление деталей. Так зачем мучиться и удалять 100
записей, когда можно удалить 1 и положиться на внешний ключ.
В этом плане пример с заказами некорректен. Заказ не является ЧАСТЬЮ
клиента, а только связан с ним определённым образом. Это всё равно что
сделать каскадный FK на справочник.

Не скажу, что не согласен, но выскажу другую точку зрения: если не делать ON UPDATE CASCADE, то FK просто не даст удалить мастера, у которого есть детали. И иногда это бывает правильнее.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550400
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Мимопроходящий" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2364979@sql.ru...
> Привет, protector!
> Ты пишешь:
>
> protector
> p> при выборе надо писать where coalesce(parentid,0) = :param
>
> Чтоб получить PLAN NATURAL, да, именно так и нужно писать.
>
Да ладно, описался, чего сразу придираться-то.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550401
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sexton
если не делать ON UPDATE CASCADE
ON DELETE CASCADE, разумеется
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550409
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Sexton" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2365012@sql.ru...
> Не скажу, что не согласен, но выскажу другую точку зрения: если не
делать ON UPDATE CASCADE, то FK просто не даст удалить мастера, у которого
есть детали. И иногда это бывает правильнее.

Вот именно, что иногда, а иногда нет. Надо смотреть по обстоятельствам.
Нельзя хаять каскадные ключи, якобы они и вовсе не нужны.
Тут уже про это говори

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550414
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, protector!
Ты пишешь:

protectorp> Да ладно, описался, чего сразу придираться-то. Ты мне ещё за Севастополь ответишь!..

--
With best regards, Мимопроходящий.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550472
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protectorНельзя хаять каскадные ключи, якобы они и вовсе не нужны.

я попробую объяснить, почему у FK вредны опции on delete cascade и on update cascade, по пунктам. Дальше каждый волен согласиться или отказаться от конкретных аргументов.

1. on update cascade означает допустимость модификации ПК. Если ПК суррогатный, то допустимость его модификации указывают на проблемы в "консерватории". Хотя обычно on update cascade лепят "до кучи", и это так никогда и не срабатывает.

2. FK строится не от мастер-таблицы, а от детали. При этом "каскадность" работает в обратную сторону - при удалении мастера удаляются детали. По мастер-таблице никак нельзя определить, к чему приведет попытка удаления в ней записи (или изменения ПК) - к молчаливому каскадному удалению (эквивалентному удалению БЕЗ зависимых деталей, в случае обычного FK) или сообщению об ошибке.

3. каскадные FK могут привести к "зациклам". я лично наблюдал в одной БД удаление ВСЕХ записей в таблице, после удаления ОДНОЙ. Это было вызвано тем, что каскадные удаления образовали зацикл через 4-5 таблиц (сами по себе зацикливания FK - тоже нехорошо).

4. комбинирование каскадных FK и триггеров "размывают" логику программы. Например, мне попеняли на "клиенты-заказы". Хорошо, другой пример - заказы и товары в заказе. Допустим, да, удобно при удалении заказа удалить его детали. Но - заказ может иметь состояния, при которых заказ удалять нельзя. По FK такие вещи не отслеживаются. Следовательно, строим триггер вида if status... then exception. Но можно забыть, что FK каскадный, или по иным причинам отключить (деактивировать) триггер, после чего возможность удаления мастера и каскадного удаления деталей станет неконтролируемой.
тут же, насчет "мучиться удаляя 100 записей" - я думаю это описка, т.к. для удаления записей деталей, связанных с мастером, достаточно выполнить один (!) оператор delete, а не 100 операторов delete.

Пока вроде бы все. При этом не отрицаю допустимости on delete cascade, никоим образом. Предупрежден - вооружен.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550628
sysdba22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv

Кто разрешает автоматически удалять детали при удалении мастера? Да почти никто. Уж слишком опасная эта штука. Причем зачастую бессмысленная.
Допустим, мы поставим авто-удаление между таблицами заказы-клиенты. Значит, при удалении клиента удалятся все заказы?

а если это не заказы-клиенты, а древовидный справочник товарных групп? пользователь создал группу "Товары народного потребления" и 30 вложенных групп. Если, позже он решил, что группа ТНП ему больше не нужна, то почему бы не облегчить ему жизнь и не дать возможность удалить одним действием как саму группу, так и все вложенные в нее.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550770
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protectorмучиться и удалять 100
записей, когда можно удалить 1 и положиться на внешний ключ.Не за и не против, просто ассоциативно вспомнилось: "машина должна работать, человек - думать"
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33550937
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока не началось, добавлю:

5. on update cascade опасен в случаях, когда здоровенная таблица деталей ссылается на малочисленный справочник, и кто-то вдруг решил поменять в с правочнике идентификатор одной из записей. То есть, в результате происходит update очень большого числа записей, да еще и по столбцу с индексом, у которого немеряное число дубликатов.

Кроме того, заявления вроде "а древовидный справочник товарных групп? пользователь создал группу "Товары народного потребления" и 30 вложенных групп. Если, позже он решил, что группа ТНП ему больше не нужна, то почему бы не облегчить ему жизнь и не дать возможность удалить одним действием как саму группу, так и все вложенные в нее." меня просто умиляют, честное слово.

при таком удалении нет возможности "отменить" удаление. Обычно если пользователь чего-то удаляет, то это чего-то попадает сначала в "Корзину". А это всего-лишь изменение parent_id у самой "верхней" записи. И только потом, при очистке корзины, уже можно удалять, "по дереву". И вообще, ситуация с удалением веток дерева настолько редкая, настолько "мощная" и настолько опасная, что делать ее по on update cascade - все равно что подвесить над собой топор.
Еще одна причина так не делать - это наличие в логике сколь-нибудь минимальной проверки прав и других условий, при которых у пользователя может просто не оказаться прав удалять один из элементов (!!!) такого дерева.

Если не убедил, извините.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33551291
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WWWovanИзначально все началось с необходимости изменять свойства группы(ID) вместе со всеми подгруппами. Для этого необходимо извлечь из списка все узлы некоторого поддерева.

Кстати в свое время в таких ситуациях использовал Null для того, чтобы указать, что значение свойства узла нужно брать из предка. Плюсы - меньше обновлений, а следовательно конфликтов. Кроме того можно разрулить вот такие ситуации : в узле какое-то свойство равно, скажем 100. У потомков есть узлы с этим свойством равным 200. Меняем в родительском узле свойство на 200. Автоматом у потомков его тоже меняем. Потом говорим ой, ошибка. Ставим назад в 100 и не знаем, в каком узле свойство со значением 200 было установлено по наследованию, а в каком нет...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552320
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"kdv" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2365117@sql.ru...
> 4. комбинирование каскадных FK и триггеров "размывают" логику
программы. Например, мне попеняли на "клиенты-заказы". Хорошо, другой
пример - заказы и товары в заказе. Допустим, да, удобно при удалении заказа
удалить его детали. Но - заказ может иметь состояния, при которых заказ
удалять нельзя. По FK такие вещи не отслеживаются. Следовательно, строим
триггер вида if status... then exception. Но можно забыть, что FK каскадный,
или по иным причинам отключить (деактивировать) триггер, после чего
возможность удаления мастера и каскадного удаления деталей станет
неконтролируемой.

Почему неконтролируемой? Получается что можно УДАЛИТЬ заказ и оставить его
детали. А если нельзя, то почему удаление заказа вместе с деталями считается
ошибчной операцией. В твоём примере ничего не изменится, если оставить
просто одну таблицу заказов. Отключили триггер и удалили не то что надо. И
при чём тут FK?

> тут же, насчет "мучиться удаляя 100 записей" - я думаю это описка,
т.к. для удаления записей деталей, связанных с мастером, достаточно
выполнить один (!) оператор delete, а не 100 операторов delete.

Это если с мастером связана ОДНА таблица деталей. Например у меня в базе
есть объекты хранящиеся в нескольких десятках таблиц. (более 1000 свойств).
Для удаления нужно никак не ОДИН оператор delete? А минимум равный числу
таблиц + в каждой таблице значения первичного ключа для удаления разные так
как связаны они цепочкой. Как минимум потребуется ХП.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552375
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv5. on update cascade опасен в случаях, когда здоровенная таблица деталей ссылается на малочисленный справочник, и кто-то вдруг решил поменять в с правочнике идентификатор одной из записей. То есть, в результате происходит update очень большого числа записей, да еще и по столбцу с индексом, у которого немеряное число дубликатов.

Поставлю интересующий меня вопрос ребром.
Ключевые поля не должны меняться - с этим полностью согласен. Но если в FK "до кучи" пихать поля не уникальные, но не пустые, с целью обновления этих полей у деталей при изменении в мастере, то on update cascade вместо обновления через триггер не имеет подводных камней? Иными словами, порочен ли on update cascade сам по себе или лишь когда его пытаются применять для обновления меняющихся (что само по себе порочно) ключевых полей?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552421
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonНо если в FK "до кучи" пихать поля не уникальныеХм... Ну вот казачок и спалился. Ты хоть пробовал это сделать?
Sextonто on update cascade не имеет подводных камней?Имеет. Один. Большой. Невозможен.
SextonИными словами, порочен ли on update cascade сам по себе или лишь когда его пытаются применять для обновления меняющихся (что само по себе порочно) ключевых полей?Ни то ни другое в чистом виде. ПК меняться не должен - с этим ты согласен. Если вдруг меняется, то в принципе никакой разницы нет, что каскадом, что триггером, лучше по-любому делать "вручную" - на клиенте или в ХП итп.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552568
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам SextonНо если в FK "до кучи" пихать поля не уникальныеХм... Ну вот казачок и спалился. Ты хоть пробовал это сделать?
Sextonто on update cascade не имеет подводных камней?Имеет. Один. Большой. Невозможен.

Пробовал, конечно, иначе бы не спрашивал. Почему невозможен? Меняю такое неключевое поле, добавленное в FK, в мастер-таблице - меняется и в детали. Наверное, мы о разном...
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552579
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sextonнеключевое поле
Наверное, мы о разном...Наверное. И ты пожалуй плохо умеешь излагать свои мысли.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552841
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНаверное. И ты пожалуй плохо умеешь излагать свои мысли.
Угу. В форум пишу либо когда устал и мыслей в голове нет, либо когда в работе, но тогда больше думаю о работе. Вообщем, от работы надо меньше отвлекаться.

А по сути вопроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE TABLE1 (
  ID1 INTEGER NOT NULL,
  FIELD1 INTEGER NOT NULL
);

CREATE TABLE TABLE2 (
  ID2 INTEGER NOT NULL,
  ID1_REF INTEGER NOT NULL,
  FIELD1_COPY INTEGER NOT NULL
);

ALTER TABLE TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY (ID1);

ALTER TABLE TABLE1 ADD CONSTRAINT UNQ_TABLE1 UNIQUE (FIELD1, ID1);

ALTER TABLE TABLE2 ADD CONSTRAINT PK_TABLE2 PRIMARY KEY (ID2);

ALTER TABLE TABLE2 ADD CONSTRAINT FK_TABLE1 FOREIGN KEY (FIELD1_COPY, ID1_REF)
REFERENCES TABLE1 (FIELD1, ID1) ON UPDATE CASCADE;
Благодаря такой конструкции, в моем понимании, поле FIELD1_COPY детали всегда будет содержать копию поля FIELD1 мастера. И если FIELD1 в мастере меняется, то изменится и FIELD1_COPY. Вот я и интересуюсь, насколько порочна такая практика?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552881
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тя нафиг... Может еще о философии поговорим?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552911
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНу тя нафиг... Может еще о философии поговорим?
Ну kdv ругает on cascade update . Я на всякий случай и поинтересовался, ругает on cascade update в принципе или применительно к ключевым полям?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552912
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector kdvНо можно забыть, что FK каскадный,
или по иным причинам отключить (деактивировать) триггер, после чего
возможность удаления мастера и каскадного удаления деталей станет
неконтролируемой.

Почему неконтролируемой? Получается что можно УДАЛИТЬ заказ и оставить его
детали.

вы что то путаете. По умолчанию FK НЕ дает удалить мастера если есть связанные с ним детали. То есть поведение RESTRICT.

protectorА если нельзя, то почему удаление заказа вместе с деталями считается
ошибчной операцией. В твоём примере ничего не изменится, если оставить
просто одну таблицу заказов. Отключили триггер и удалили не то что надо. И
при чём тут FK?

потому что почти в любой прикладной области все сложнее этого примитивного примера. И еще потому, что я написал что НАДО ДУМАТЬ. Я не отрицаю on delete cascade. Я говорю что он опасен при БЕЗДУМНОМ применении.

protectorесть объекты хранящиеся в нескольких десятках таблиц. (более 1000 свойств).
Для удаления нужно никак не ОДИН оператор delete? А минимум равный числу
таблиц + в каждой таблице значения первичного ключа для удаления разные так
как связаны они цепочкой. Как минимум потребуется ХП.

пора бы уже догадаться, что мне по барабану чего вы там с таблицами делаете, и как удаляете. Хоть delete from rdb$pages.
Нарушают же нормальные формы - и никто этих людей не расстреливает. Написал ты каскадное удаление - если вдруг случатся грабли, то ТЫ их огребешь. Если ты грабли предусмотрел - молодец. Я же не спорю с тобой по поводу конкретной, ТВОЕЙ, прикладной системы?
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33552950
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonВот я и интересуюсь, насколько порочна такая практика?

суррогатный ПК не предполагает изменений. альтернативный ключ (unique) - допускает. Соответственно, против каскадного update на альтернативном ключе не имею ничего против. А про то, что каскадное обновление автоматически обновляет таблицу деталей, которая может содержать много одинаковых значений - просто надо помнить.

Ребята, я смотрю на эти вопросы почти что философски, пересмотрев тучу разных прикладных решений. Модель БД строится под конкретную прикладную область (в этом случае даже конкретное "дерево" можно считать именно прикладным решением). Решение для одной прикладной области не обязательно подходит для другой, вот и все. И не надо убиваться по этому поводу или спорить, отстаивая свою, конкретную, точку зрения, сформированную на одной прикладной области.
Потому что не просто смена прикладной области, а даже только усовершенствование конкретного прикладного решения может потребовать изменить эту самую точку зрения.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33553858
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
protector
kdv
> Но можно забыть, что FK каскадный,
> или по иным причинам отключить (деактивировать) триггер,
после чего
> возможность удаления мастера и каскадного удаления
деталей станет
> неконтролируемой.

> Почему неконтролируемой? Получается что можно УДАЛИТЬ заказ и
оставить его
> детали.

>
вы что то путаете. По умолчанию FK НЕ дает удалить мастера если есть
связанные с ним детали. То есть поведение RESTRICT.

Я так понял, что НЕКОНТРОЛИРУЕМОЕ удаление связано именно с каскадным FK.
Так вот я одного не понимаю. Если записи в таблице деталей не ИМЕЮТ СМЫСЛА
без мастера, почему их нельзя удалить каскадно и автоматически. В упор не
вижу здесь никаких препядствий.

kdv
я
> А если нельзя, то почему удаление заказа вместе с деталями
считается
> ошибчной операцией. В твоём примере ничего не изменится, если
оставить
> просто одну таблицу заказов. Отключили триггер и удалили не то
что надо. И
> при чём тут FK?

> потому что почти в любой прикладной области все сложнее этого
примитивного примера. И еще потому, что я написал что НАДО ДУМАТЬ. Я не
отрицаю on delete cascade. Я говорю что он опасен при БЕЗДУМНОМ применении.

Так ведь бездумное применение не имеет к каскадным FK никакого отношения.
Бездумное применение опасно само по себе. Неужели бездумное применение
триггеров или ХП менее опаасно? В данном случае речь вообще о другом...
kdv
пора бы уже догадаться, что мне по барабану чего вы там с таблицами
делаете, и как удаляете. Хоть delete from rdb$pages.

Интересная мысль. Надо будет её обдумать.

kdv
Нарушают же нормальные формы - и никто этих людей не расстреливает.

А надо-бы!
kdv
Написал ты каскадное удаление - если вдруг случатся грабли, то ТЫ их
огребешь. Если ты грабли предусмотрел - молодец. Я же не спорю с тобой по
поводу конкретной, ТВОЕЙ, прикладной системы?

Я просто привёл пример. Конкретный пример, когда каскадно удаление удобно. И
значительно облекчает жизнь мне как разработчику. Могу другой пример
привести из другой прикладной области.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33553866
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Ребята, я смотрю на эти вопросы почти что философски, пересмотрев тучу
разных прикладных решений. Модель БД строится под конкретную прикладную
область (в этом случае даже конкретное "дерево" можно считать именно
прикладным решением). Решение для одной прикладной области не обязательно
подходит для другой, вот и все. И не надо убиваться по этому поводу или
спорить, отстаивая свою, конкретную, точку зрения, сформированную на одной
прикладной области.
Потому что не просто смена прикладной области, а даже только
усовершенствование конкретного прикладного решения может потребовать
изменить эту самую точку зрения.

Я очень уважаю твои знания и опыт, но и сам имею некоторый опыт в
проектирвании нескольких систем для различных прикладных областей на Оракуле
и Firebird. В том числе и кроссерверных. ТАк вот, IMHO предметная область к
проектированию СУБД имеет довольно опосредованное отношение, поскольку РМД
она и в африке РМД. Математческие модели разных предметных областей, в
общем-то отличаются незначительно. Набор множест отношений и операций над
ними. И общие принципы везде одинаковые. Где-то проводка, где то линия
жизни. Мат модель этих сущностей одна. Просто, если зафиксировать тезисы, то
ты утверждаешь, что

Каскадные FK опасны и их надо стараться избегать.

Я же всего-лишь утверждаю, что

Каскоадные FK очень удобны и их надо активно использовать.

Вот и всё. В остальном я с тобой полностью согласен.



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33553995
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protectorКаскоадные FK очень удобны и их надо активно использовать.1. Пожалуй стоит разделить обсуждение случаев update и delete.
2. Надо конкретизировать - для естесственого ключа или для искусственного.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33554390
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KDV>> Нарушают же нормальные формы - и никто этих людей не расстреливает.
P> А надо-бы!
Т.е. я так понимаю, ты всегда работаешь с абсолютно нормализованными БД? Тормоза не достали? :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33554579
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
protector kdvНарушают же нормальные формы - и никто этих людей не расстреливает.
А надо-бы!

значит ты теоретик, а не практик.

protectorКаскадные FK очень удобны и их надо активно использовать.
добро пожаловать в каскадную проктологию.
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33555180
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Kull Damned" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2371624@sql.ru...
> KDV>> Нарушают же нормальные формы - и никто этих людей не
расстреливает.
> P> А надо-бы!
> Т.е. я так понимаю, ты всегда работаешь с абсолютно нормализованными
БД? Тормоза не достали? :)

Нет конечно К сожалению реальность всё ещё далека от идеала. Тут ты
прав

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ошибка при попытке создания foreign key в IBExpert
    #33555183
protector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"kdv" <nospam@sql.ru>; сообщил/сообщила в новостях следующее:
news:2371909@sql.ru...
> protector
> kdv
> Нарушают же нормальные формы - и никто этих людей не
расстреливает.
>
> А надо-бы!
Вы что шуток не понимаете? ;

> protector
> Каскадные FK очень удобны и их надо активно использовать.
>
> добро пожаловать в каскадную проктологию.

Ну вот сразу обзываться...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Ошибка при попытке создания foreign key в IBExpert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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