Внешний ключ MYSQL OnDelete цепочка событий - PullRequest
0 голосов
/ 26 сентября 2019

Допустим, есть две таблицы:

Компании

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 от удаления .Но в этом случае я хочу, чтобы строки были удалены, поскольку компания перестанет существовать.

  1. Что такое цепочка событий , которые происходят в иностраннойключ onDelete каскадное событие?Например: сначала удаляется строка из компаний, а затем все остальные строки внешнего ключа удаляются позже или наоборот?

  2. Как мне решить эту проблему?

РЕДАКТ. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...