Bug #5103 | Cannot add or update a child row: a foreign key constraint fails | ||
---|---|---|---|
Submitted: | 19 Aug 2004 0:49 | Modified: | 9 May 2007 10:08 |
Reporter: | Zachary Nguyen | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server | Severity: | S4 (Feature request) |
Version: | 4.0.20-standard | OS: | Linux (Linux) |
Assigned to: | Assigned Account | CPU Architecture: | Any |
[19 Aug 2004 0:49]
Zachary Nguyen
[19 Aug 2004 11:19]
Marko Mäkelä
Verified also on 4.1. Also UPDATE categories SET pid=5 WHERE pid=1 fails.
[20 Aug 2004 14:39]
Heikki Tuuri
Hi! This is the documented behavior. http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html " A deviation from SQL standards: If ON UPDATE CASCADE or ON UPDATE SET NULL recurses to update the same table it has already updated during the cascade, it acts like RESTRICT. " Thus, this indeed is a feature request to allow cascaded updates within the SAME table. InnoDB currently does not allow then because they could lead to an infinite loop of updates. Regards, Heikki
[2 Feb 2005 15:17]
Eduardo Sandino
If i have circular reference between to tables in what cases it could have troubles... my tables are: CREATE TABLE `producto` ( `id` int(10) unsigned NOT NULL auto_increment, `tipo` int(10) unsigned NOT NULL default '0', `moneda` int(10) unsigned NOT NULL default '0', `unidad_principal` int(10) unsigned default '0', `unidad_pequena` int(10) unsigned default '0', `codigo_externo` varchar(20) character set latin1 default NULL, `codigo_interno` varchar(20) character set latin1 default NULL, `descripcion` varchar(100) character set latin1 NOT NULL default '', `foto` varchar(30) character set latin1 default NULL, `cantidad_minima` int(10) unsigned NOT NULL default '0', `unidad_cantidad_minima` int(10) unsigned default '0', `costo_unitario` decimal(11,5) NOT NULL default '0.00000', `precio_venta` decimal(11,5) NOT NULL default '0.00000', `ice` decimal(5,2) NOT NULL default '0.00', `saldo_fisico` int(11) default NULL, `saldo_val` decimal(11,5) default NULL, `saldo_fisico_cons` int(11) default NULL, `saldo_val_cons` decimal(11,5) default NULL, `fecha_cons` datetime default NULL, `imagen` varchar(20) character set latin1 default NULL, `ubicacion` varchar(20) character set latin1 default NULL, `descripcion_detallada` varchar(250) character set latin1 default NULL, `tipo_vencimiento` char(1) character set latin1 default NULL, `precio_unitario_unidad_principal` decimal(11,5) NOT NULL default '0.00000', `tipo_precio` char(1) collate latin1_spanish_ci NOT NULL default '', `ice_unidad` int(10) unsigned default '0', `serie` char(1) collate latin1_spanish_ci default NULL, `lote` char(1) collate latin1_spanish_ci default NULL, PRIMARY KEY (`id`), UNIQUE KEY `descripcion` (`descripcion`), UNIQUE KEY `Index_7` (`codigo_interno`), KEY `tipo` (`tipo`), KEY `moneda` (`moneda`), KEY `unidad_principal` (`unidad_principal`), KEY `unidad_pequena` (`unidad_pequena`), KEY `producto_ibfk_11` (`unidad_cantidad_minima`), KEY `producto_ibfk_12` (`ice_unidad`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='InnoDB free: 6144 kB; (`tipo`) REFER `negnet/producto_tipo`('; CREATE TABLE `unidad` ( `id` int(10) unsigned NOT NULL auto_increment, `producto` int(10) unsigned default '0', `descripcion` varchar(25) character set latin1 NOT NULL default '', `equivalencia` int(10) unsigned default NULL, `factor` decimal(11,5) NOT NULL default '0.00000', `precio_venta` decimal(11,5) NOT NULL default '0.00000', `factor_precio` decimal(11,5) NOT NULL default '0.00000', PRIMARY KEY (`id`), KEY `unidad_ibfk_2` (`equivalencia`), KEY `FK_unidad_2` (`producto`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci COMMENT='InnoDB free: 6144 kB; (`equivalencia`) REFER `negnet/unidad`';
[7 May 2007 19:00]
Jorge Bernal
Isn't this a duplicate of #3439 ?
[9 May 2007 10:08]
Marko Mäkelä
Yes,this is a duplicate of Bug #3439. I'm sorry for not flagging it earlier. (If only the MySQL bug database featured a useable full-text search.)