elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  MySQL - Problemas con ON UPDATE CASCADE
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: MySQL - Problemas con ON UPDATE CASCADE  (Leído 761 veces)
Anteros

Desconectado Desconectado

Mensajes: 127


Ver Perfil
MySQL - Problemas con ON UPDATE CASCADE
« en: 24 Noviembre 2015, 22:23 »

Hola,

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


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.215


ASMático


Ver Perfil WWW
Re: MySQL - Problemas con ON UPDATE CASCADE
« Respuesta #1 en: 25 Noviembre 2015, 16:34 »

¿Existe en Pool un id = 0? Las claves foráneas tienen que hacer referencia a un registro válido, es parte de su utilidad.

Otra cosa es que le quieras poner status=NULL. En ese caso sí te debería dejar.


En línea

Anteros

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: MySQL - Problemas con ON UPDATE CASCADE
« Respuesta #2 en: 25 Noviembre 2015, 17:42 »

El error me dice cual es el problema, la llave foranea compuesta del INDEX (pool_id,status). Lo que deseo saber es el modo de poder resolver este tipo de problemas en el ON UPDATE CASCADE

Voy a testear lo del NULL que comentas, pero status siempre debe ser un CHAR(1) '1' / '0'
« Última modificación: 25 Noviembre 2015, 18:33 por Anteros » En línea

Anteros

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: MySQL - Problemas con ON UPDATE CASCADE
« Respuesta #3 en: 25 Noviembre 2015, 18:36 »

He testeado seteando a NULL y funciona

Código:
UPDATE pool SET status = NULL;

pool, lanes y elements relacionados se setean status = NULL

Código:
UPDATE lane SET STATUS = NULL;

y solo los lanes se setean a status = NULL (lo mismo para element) Sin errores


Ahora el problema es que si ejecuto

Código:
UPDATE pool SET status = '1';

solo se setea status = 1 de pool, ni los lanes ni los elements se setean a status ='1' siguen con su status = NULL
« Última modificación: 25 Noviembre 2015, 18:38 por Anteros » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.215


ASMático


Ver Perfil WWW
Re: MySQL - Problemas con ON UPDATE CASCADE
« Respuesta #4 en: 25 Noviembre 2015, 19:08 »

La pregunta es, ¿sabes cual es la utilidad de las claves foráneas? Se utilizan para relacionar registros y tablas. Si un registro no está relacionado con otro registro de otra tabla, modificar un registro no va a modificar el otro.

Si has puesto TODOS los elementos de la tabla a NULL, entonces NINGUNO va a ser modificado al hacer el UPDATE, aunque tenga CASCADE.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problemas php/mysql update
Desarrollo Web
byebye 2 1,111 Último mensaje 27 Mayo 2004, 21:45
por byebye
problema con UPDATE de mysql
PHP
johnwmartinez 8 1,662 Último mensaje 16 Julio 2007, 17:17
por Azielito
UPDATE mySQL en PHP
PHP
sexto 9 24,472 Último mensaje 8 Diciembre 2007, 13:25
por @ohk
Insertar datos con un update, dentro de otro update con SQLi(Mysql)
Nivel Web
WarGhost 3 3,883 Último mensaje 23 Agosto 2011, 03:37
por WarGhost
duda con update mysql
Desarrollo Web
xemnas 1 722 Último mensaje 23 Abril 2012, 13:21
por HdM
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines