Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

MySQL Удаление записей из нескольких связанных таблиц

Роман Protocol Мыслитель (8562), закрыт 5 лет назад
Всем привет!
Написал запросы на MySQL для пакетного удаления строк из нескольких связанных таблиц. Нужно удалить все записи, что относятся к профессии по переданному id.
1 вариант
DELETE Records,
Exe_service,
List_of_service,
List_of_master_service,
Professions_List
FROM Records
RIGHT JOIN Exe_service
ON Records.Exe_service_Executors_idExecutors = Exe_service.Executors_idExecutors
RIGHT JOIN List_of_service
ON Exe_service.List_of_service_idList_of_service = List_of_service.idList_of_service
RIGHT JOIN List_of_master_service
ON List_of_service.List_of_master_service_idList_of_master_service = List_of_master_service.idList_of_master_service
RIGHT JOIN Professions_List
ON List_of_master_service.Professions_List_idProfessions_List = Professions_List.idProfessions_List
WHERE Professions_List.idProfessions_List = :idProf

2 вариант
DELETE Professions_List,
List_of_master_service,
List_of_service,
Exe_service,
Records
FROM Professions_List
LEFT JOIN List_of_master_service
ON Professions_List.idProfessions_List = List_of_master_service.Professions_List_idProfessions_List
LEFT JOIN List_of_service
ON List_of_master_service.idList_of_master_service = List_of_service.List_of_master_service_idList_of_master_service
LEFT JOIN Exe_service
ON List_of_service.idList_of_service = Exe_service.List_of_service_idList_of_service
LEFT JOIN Records
ON Exe_service.Executors_idExecutors = Records.Exe_service_Executors_idExecutors
WHERE Professions_List.idProfessions_List = :idProf

В обоих случаях выдаётся ошибка: #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`vistae0f_roma`.`List_of_master_service`, CONSTRAINT `List_of_master_service_ibfk_1` FOREIGN KEY (`Professions_List_idProfessions_List`) REFERENCES `Professions_List` (`idProfessions_List`) ON)
Я понимаю, что там ключ связан, но удалить как - то надо.
Я не пойму как правильно запрос выстроить, чтобы сразу удалялось из таблиц связанные строки.
Спасибо за ответы!
Лучший ответ
Андрей Высший разум (425879) 5 лет назад
Если у тебя внешние ключи с ON DELETE CASCADE, то при удалении записи из главной таблицы НЕ надо явно удалять записи из подчинённых таблиц. Все связанные записи из подчинённых таблиц будут удалены автоматически.
Роман ProtocolМыслитель (8562) 5 лет назад
> внешние ключи с ON DELETE CASCADE
Нет.
Где указывать эту конструкцию, в смысле в каком месте объявления таблицы?
Если указать ON DELETE CASCADE побочных эффектов не будет?
Тогда (tckb nf,kbws c ON DELETE CASCADE) запрос так можно выполнять?:
DELETE FROM Professions_List
WHERE idProfessions_List = :idProf
Андрей Высший разум (425879) Это задаётся при объявлении внешних ключей. http://denis.in.ua/foreign-keys-in-mysql.htm Нет, никаких побочных эффектов - кроме автоматического удаления связанных записей подчинённых таблиц - не будет. И да, запрос сокращается до удаления одной записи из одной таблицы.
Роман ProtocolМыслитель (8562) 5 лет назад
Тогда для перестраховки везде можно проставить к ключам ON DELETE CASCADE?
Андрей Высший разум (425879) В тех случаях, когда данные подчинённой таблицы не имеют смысла без главной таблицы - безусловно, да. Но [крайне редко] бывают случаи, когда данные подчинённой таблицы должны оставаться и при удалении данных из главной. В этом случае предпочтительнее не CASCADE, а NULL.
Остальные ответы
Иван Иванов Мудрец (17783) 5 лет назад
Ну если Records - это таблица с Primary Key, то удалять запись из неё надо в последнюю очередь. В принципе, второй запрос должен работать...

Ну и как всегда, костыльное решение: сохранять id удаляемого объекта, удалять объект из одной таблицы запросом, потом находить запись в другой таблице по этому id, снова удалять и тп. Работать будет крайне медленно, но хоть что-то))
Роман ProtocolМыслитель (8562) 5 лет назад
Удалять не таблицу, а записи из неё.
Нет, ни первый, ни второй не работают корректно - без ошибок.
Иван Иванов Мудрец (17783) Дополнил ответ)) Других идей нету)
Даниил Казнин Знаток (340) 5 лет назад
Помогите решил сделать свое сервер самп, я начал загружать БД и там ошибка
Даниил Казнин Ученик (103), Вопрос открыт 3 минуты назад
Ошибка
SQL-запрос:

-- --------------------------------------------------------
--
-- Структура таблицы `adminlog`
--
CREATE TABLE `adminlog` (

`ID` INT( 11 ) NOT NULL ,
`Name` VARCHAR( 24 ) NOT NULL ,
`Data` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`nakaz` VARCHAR( 24 ) CHARACTER SET cp1251 NOT NULL ,
`Names` VARCHAR( 24 ) CHARACTER SET cp1251 NOT NULL ,
`reason` VARCHAR( 100 ) CHARACTER SET cp1251 NOT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

Ответ MySQL: Документация

#1067 - Invalid default value for 'Data'
Роман ProtocolМыслитель (8562) 5 лет назад
Здесь DEFAULT CHARSET = utf8mb4;
Может так DEFAULT CHARSET = 'utf8mb4';
Похожие вопросы