Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, возникла такая проблема, создал триггер, который при удалении клиента из таблицы клиентов также должен удалить все контракты, с этим клиентом связанные.
Курсор выбирает те записи, контракты которых ещё не истекли.
Поле Individual таблицы insurance_contract содержит id клиентов, являясь внешним ключом.
Неактивен
Используйте:
Неактивен
rgbeast написал:
Используйте:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
http://stackoverflow.com/questions/3463 … or-process
С предыдущей ошибкой справился, спасибо большое.
Но теперь не знаю что сделать с непосредственно удалением, не даёт удалять.
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`insuranceagency`.`insurance_contract`, CONSTRAINT `insurance_contract_ibfk_1` FOREIGN KEY (`Individual`) REFERENCES `individual` (`id_individual`))
Вот так выглядит создание таблиц:
'CREATE TABLE `insurance_contract` (
`id_contract` int(11) NOT NULL AUTO_INCREMENT,
`Sum_insured` int(11) NOT NULL,
`Beginning` date NOT NULL,
`Ending` date NOT NULL,
`Individual` int(11) DEFAULT NULL,
`Company` int(11) DEFAULT NULL,
`Agent` int(11) NOT NULL,
`Object` int(11) NOT NULL,
`Category` int(11) NOT NULL,
PRIMARY KEY (`id_contract`),
KEY `Individual_idx` (`Individual`),
KEY `ID_company_idx` (`Company`),
KEY `ID_agent_idx` (`Agent`),
KEY `ID_object_idx` (`Object`),
KEY `ID_service_idx` (`Category`),
CONSTRAINT `insurance_contract_ibfk_1` FOREIGN KEY (`Individual`) REFERENCES `individual` (`id_individual`),
CONSTRAINT `insurance_contract_ibfk_2` FOREIGN KEY (`Company`) REFERENCES `company` (`id_company`),
CONSTRAINT `insurance_contract_ibfk_3` FOREIGN KEY (`Agent`) REFERENCES `insurance_agent` (`id_agent`),
CONSTRAINT `insurance_contract_ibfk_4` FOREIGN KEY (`Object`) REFERENCES `object_insurance` (`id_object`),
CONSTRAINT `insurance_contract_ibfk_5` FOREIGN KEY (`Category`) REFERENCES `guide_services` (`id_guide`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=cp1251'
'CREATE TABLE `individual` (
`id_individual` int(11) NOT NULL AUTO_INCREMENT,
`FirstName` varchar(45) NOT NULL,
`LastName` varchar(45) NOT NULL,
`Date_of_birth` date NOT NULL,
`Address` varchar(100) NOT NULL,
`Passport_id` int(11) NOT NULL,
`Phone` varchar(15) DEFAULT NULL,
PRIMARY KEY (`id_individual`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=cp1251'
Неактивен
Определите FOREIGN KEY с опцией ON DELETE CASCADE и тогда триггер не потребуется
Неактивен
rgbeast написал:
Определите FOREIGN KEY с опцией ON DELETE CASCADE и тогда триггер не потребуется
Я бы с радостью, но по заданию требуется реализовать триггер.
Неактивен
Тогда ON DELETE SET NULL
Неактивен
rgbeast написал:
Тогда ON DELETE SET NULL
Опять же благодарение Вам за Вашу помощь, удаление произошло, но только не совсем правильно.
Я даже не знаю, как это описать: при запросе DELETE from individual WHERE id_individual = 11; удалились все записи с клиентами, а из нужной записи только одно поле.
Получается что-то подобное:
Отредактированно Ovenvan (13.05.2016 09:55:15)
Неактивен
У Вас противоречивое задание: использовать триггер для того, для чего уже есть FOREIGN KEY. У FOREIGN KEY три варианта поведения при ON CASCADE:
1. RESTRICT (по-умолчанию). В этом случае удаление не пройдет и до триггера не дойдет дело
2. SET NULL. Удаление сработает, но триггер нет, так как поле id уже будет NULL
3. DELETE - все хорошо, но зачем триггер
Неактивен
rgbeast написал:
У Вас противоречивое задание: использовать триггер для того, для чего уже есть FOREIGN KEY. У FOREIGN KEY три варианта поведения при ON CASCADE:
1. RESTRICT (по-умолчанию). В этом случае удаление не пройдет и до триггера не дойдет дело
2. SET NULL. Удаление сработает, но триггер нет, так как поле id уже будет NULL
3. DELETE - все хорошо, но зачем триггер
Я понимаю, просто необходимо реализовать триггер на целостность БД, также перед удалением нужно проверить определённое условие - закончился ли срок контракта или нет.
Вот только алгоритм работает совсем не так, удаляет все записи с клиентами.
Неактивен
Немного исправил триггер, и всё заработало
Отредактированно Ovenvan (13.05.2016 10:35:33)
Неактивен
delete from insurance_contract where Individual != id; -- удалить все записи из таблицы кроме тех где individual = id
Неактивен