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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ошибка cannot delete or update a parent row: a foreign key constraint fails

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Не пойму, как работают FK
Arcoslov
Отправлено: 03 Ноября, 2015 - 21:00:03
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Здравствуйте.

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

Имею две таблицы. Одна из таблиц имеет 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.

(Отредактировано автором: 03 Ноября, 2015 - 21:03:57)

 
 Top
SAD Модератор
Отправлено: 03 Ноября, 2015 - 21:47:01
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




ON DELETE: set null может нужно?
 
 Top
MiksIr
Отправлено: 03 Ноября, 2015 - 22:44:06
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


В MySQL "no action" === "restrict"


-----
self-banned
 
 Top
Arcoslov
Отправлено: 05 Ноября, 2015 - 19:22:25
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




SAD пишет:
ON DELETE: set null может нужно?

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

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

Всё равно не работает Ниндзя
 
 Top
SAD Модератор
Отправлено: 05 Ноября, 2015 - 19:38:22
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




а как Вы пытаетесь, что - то идентифицировать, если родитель удален? вместо ид родителя будет null и все
 
 Top
Мелкий Супермодератор
Отправлено: 05 Ноября, 2015 - 20:10:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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.


-----
PostgreSQL DBA
 
 Top
Arcoslov
Отправлено: 05 Ноября, 2015 - 20:59:10
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




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.


хм.. зачем тогда нужны две разные тычки?..
 
 Top
Мелкий Супермодератор
Отправлено: 05 Ноября, 2015 - 21:26:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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 пишет:
идентифицировать можно руками\глазами и куда-то выгрузить.

Ну и что вы будете делать без собственно родителя?
Классика жанра: не удалять, а помечать строку удалённой.


-----
PostgreSQL DBA
 
 Top
Arcoslov
Отправлено: 06 Ноября, 2015 - 10:57:16
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Дек. 2014  


Помог: 0 раз(а)




Мелкий,

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

(Отредактировано автором: 06 Ноября, 2015 - 10:57:47)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB