Допустим, есть две таблицы:
Компании
CREATE TABLE `companies` (
`companyID` int(11) NOT NULL AUTO_INCREMENT,
`companyName` varchar(255) NOT NULL,
`allocatedUsers` int(11) NOT NULL,
`accountValidTill` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`premiumCustomer` tinyint(4) DEFAULT '1',
`batteryOptimizationToBeDel` tinyint(4) DEFAULT '0',
`tz` varchar(45) NOT NULL DEFAULT 'Asia/Kolkata',
`instanceID` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`companyID`)
) ENGINE=InnoDB AUTO_INCREMENT=2378 DEFAULT CHARSET=latin1;
и другие rosterTemplate
CREATE TABLE `rosterTemplate` (
`rosterTemplateID` int(11) NOT NULL AUTO_INCREMENT,
`companyID` int(11) NOT NULL,
`start` varchar(45) NOT NULL,
`end` varchar(45) NOT NULL,
`name` varchar(100) NOT NULL DEFAULT 'default',
`isDefault` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`rosterTemplateID`),
KEY `fk_rt_1_idx` (`companyID`),
CONSTRAINT `fk_rt_1` FOREIGN KEY (`companyID`) REFERENCES `companies` (`companyID`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=latin1;
Я хочу ограничить удаление любых строк в rosterTemplate , где isDefault == 0
Изначально я думал о написании onDeleteтриггер в rosterTemplate , который обрабатывает это с помощью простого оператора if-else .
Теперь, если строка из companies таблица удалена , мой onDelete триггер будет предотвращать строки в rosterTemplate от удаления .Но в этом случае я хочу, чтобы строки были удалены, поскольку компания перестанет существовать.
Что такое цепочка событий , которые происходят в иностраннойключ onDelete каскадное событие?Например: сначала удаляется строка из компаний, а затем все остальные строки внешнего ключа удаляются позже или наоборот?
Как мне решить эту проблему?
РЕДАКТ. 1: Это триггер onDelete
BEGIN
IF OLD.isDefault = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'This record is sacred! You are not allowed to remove it!!';
END IF;
END