Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ошибка cannot delete or update a parent row: a foreign key constraint fails
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » ошибка cannot delete or update a parent row: a foreign key constraint fails

Страниц (1): [1]
 

1. Arcoslov - 03 Ноября, 2015 - 21:00:03 - перейти к сообщению
Здравствуйте.

Помогите, пожалуйста, разобраться, как работают связи в таблицах.

Имею две таблицы. Одна из таблиц имеет FK, он указывает на атрибут другой таблицы.
Хочу: чтобы при обновлении записи в родительской таблицы запись обновлялась в дочерней, а при удалении записи из родительской таблицы - с дочерней ничего не происходило.
делаю настройки FK в дочерней таблице: ON UPDATE: cascade, ON DELETE: no action.

Если в дочерней таблице есть записи, которые ссылаются на записи в родительской таблице, я пытаюсь удалить кортеж в родительской таблице, то происходит ошибка:
CODE (htmlphp):
скопировать код в буфер обмена
  1. SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`base`.`table2`, CONSTRAINT `table2_ibfk_2` FOREIGN KEY (`w_id`) REFERENCES `table1` (`id`) ON UPDATE CASCADE)
  2. The SQL being executed was: DELETE FROM `table1` WHERE `id`=9


Видимо, я чего-то не понимаю.

p.s. таблицы innodb.
2. SAD - 03 Ноября, 2015 - 21:47:01 - перейти к сообщению
ON DELETE: set null может нужно?
3. MiksIr - 03 Ноября, 2015 - 22:44:06 - перейти к сообщению
В MySQL "no action" === "restrict"
4. Arcoslov - 05 Ноября, 2015 - 19:22:25 - перейти к сообщению
SAD пишет:
ON DELETE: set null может нужно?

Нет, зачем же мне set null. Если сделать set null, потом ничего нельзя будет идентифицировать.

MiksIr пишет:
В MySQL "no action" === "restrict"
В MySQL "no action" === "restrict" Странно, я вроде читал, что no action означает, что не нужно выполнять действия для дочерней таблицы, в случае действия над родительской; а restrict означает запретить действие над родительской таблицей, если в дочерней уже есть запись с таким fk.

Всё равно не работает Ниндзя
5. SAD - 05 Ноября, 2015 - 19:38:22 - перейти к сообщению
а как Вы пытаетесь, что - то идентифицировать, если родитель удален? вместо ид родителя будет null и все
6. Мелкий - 05 Ноября, 2015 - 20:10:33 - перейти к сообщению
https://dev[dot]mysql[dot]com/doc/refman[dot][dot][dot]oreign-keys[dot]html
Цитата:
NO ACTION: A keyword from standard SQL. In MySQL, equivalent to RESTRICT.
7. Arcoslov - 05 Ноября, 2015 - 20:59:10 - перейти к сообщению
SAD пишет:
а как Вы пытаетесь, что - то идентифицировать, если родитель удален? вместо ид родителя будет null и все

идентифицировать можно руками\глазами и куда-то выгрузить.
Как это можно будет сделать, если я удалю больше одного родителя? Если будет null и всё, то это уже не удастся.
(Добавление)
Мелкий пишет:
https://dev[dot]mysql[dot]com/doc/refman[dot][dot][dot]oreign-keys[dot]html
Цитата:
NO ACTION: A keyword from standard SQL. In MySQL, equivalent to RESTRICT.


хм.. зачем тогда нужны две разные тычки?..
8. Мелкий - 05 Ноября, 2015 - 21:26:23 - перейти к сообщению
Arcoslov пишет:
хм.. зачем тогда нужны две разные тычки?..

Требование стандарта.
Идею разделения на два состояния внятно описывает вики: https://en[dot]wikipedia[dot]org/wiki/Foreign_key
Цитата:
NO ACTION and RESTRICT are very much alike. The main difference between NO ACTION and RESTRICT is that with NO ACTION the referential integrity check is done after trying to alter the table. RESTRICT does the check before trying to execute the UPDATE or DELETE statement.

Впрочем, mysql стандарты SQL вообще выполняет несколько частично. В этом случае решили сделать alias для RESTRICT и записать различие в документации.

Arcoslov пишет:
идентифицировать можно руками\глазами и куда-то выгрузить.

Ну и что вы будете делать без собственно родителя?
Классика жанра: не удалять, а помечать строку удалённой.
9. Arcoslov - 06 Ноября, 2015 - 10:57:16 - перейти к сообщению
Мелкий,

ok, спасибо, ошибку осознал.
Да, сделаю по классике жанра.

 

Powered by ExBB FM 1.0 RC1