Tengo el siguiente script.
Código:
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`cascadeupdate` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `cascadeupdate`;
/*Table structure for table `element` */
DROP TABLE IF EXISTS `element`;
CREATE TABLE `element` (
`element_id` int(11) NOT NULL AUTO_INCREMENT,
`pool_pool_id` int(11) NOT NULL,
`element` varchar(45) DEFAULT NULL,
`status` char(1) DEFAULT '1',
PRIMARY KEY (`element_id`),
KEY `fk_element_pool1_idx` (`pool_pool_id`,`status`),
CONSTRAINT `fk_element_pool1` FOREIGN KEY (`pool_pool_id`, `status`) REFERENCES `pool` (`pool_id`, `status`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*Data for the table `element` */
insert into `element`(`element_id`,`pool_pool_id`,`element`,`status`) values (1,1,'element 1','1'),(2,1,'element 2','1'),(3,1,'element 3','1');
/*Table structure for table `flowchart` */
DROP TABLE IF EXISTS `flowchart`;
CREATE TABLE `flowchart` (
`flowchart_id` int(11) NOT NULL AUTO_INCREMENT,
`flowchart` varchar(45) DEFAULT NULL,
`process_process_id` int(11) NOT NULL,
`status` char(1) DEFAULT '1',
PRIMARY KEY (`flowchart_id`),
UNIQUE KEY `index2` (`flowchart_id`,`status`),
KEY `fk_flowchart_process1_idx` (`process_process_id`,`status`),
CONSTRAINT `fk_flowchart_process1` FOREIGN KEY (`process_process_id`, `status`) REFERENCES `process` (`process_id`, `status`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `flowchart` */
/*Table structure for table `lane` */
DROP TABLE IF EXISTS `lane`;
CREATE TABLE `lane` (
`lane_id` int(11) NOT NULL AUTO_INCREMENT,
`pool_pool_id` int(11) NOT NULL,
`lane` varchar(45) DEFAULT NULL,
`status` char(1) DEFAULT '1',
PRIMARY KEY (`lane_id`),
KEY `fk_lane_pool_idx` (`pool_pool_id`,`status`),
CONSTRAINT `fk_lane_pool` FOREIGN KEY (`pool_pool_id`, `status`) REFERENCES `pool` (`pool_id`, `status`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*Data for the table `lane` */
insert into `lane`(`lane_id`,`pool_pool_id`,`lane`,`status`) values (1,1,'lane 1','1'),(2,1,'lane 2','1'),(3,1,'lane 3','1');
/*Table structure for table `pool` */
DROP TABLE IF EXISTS `pool`;
CREATE TABLE `pool` (
`pool_id` int(11) NOT NULL AUTO_INCREMENT,
`pool` varchar(45) DEFAULT NULL,
`status` char(1) DEFAULT '1',
PRIMARY KEY (`pool_id`),
UNIQUE KEY `index2` (`pool_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*Data for the table `pool` */
insert into `pool`(`pool_id`,`pool`,`status`) values (1,'pool 1','1');
/*Table structure for table `process` */
DROP TABLE IF EXISTS `process`;
CREATE TABLE `process` (
`process_id` int(11) NOT NULL AUTO_INCREMENT,
`process` varchar(45) DEFAULT NULL,
`status` char(1) DEFAULT '1',
PRIMARY KEY (`process_id`),
UNIQUE KEY `index2` (`process_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `process` */
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
Es una bd con 3 tablas relacionadas entre si
Lane<---Pool--->Element
Mi objetivo es implementar el UPDATE CASCADE, así cuando updateo el status=0 de Pool
el status de Lane y Element también sea 0. Hasta aquí todo bien, el problema es cuando quiero actualizar el status del Lane o del Element sin tener que actualizar el status de Pool. Me salta el siguiente error
Código:
<e>Query: update lane set status = 0
Error Code: 1452
Cannot add or update a child row: a foreign key constraint fails (`cascadeupdate`.`lane`, CONSTRAINT `fk_lane_pool` FOREIGN KEY (`pool_pool_id`, `status`) REFERENCES `pool` (`pool_id`, `status`) ON DELETE NO ACTION ON UPDATE CASCADE)
Obviamente el error se da por la llave compuesta (`pool_id`, `status`)...
Cómo puedo arreglar esto? Para poder hacer status = 0 a Element o Lane pero sin perder el UPDATE CASCADE que tienen con Pool
Gracias