2011-09-24 15 views
9

Tengo tres tablas: categorías, idiomas y categorías_idiomas. Categories_languages ​​es una tabla de muchos a muchos que une categorías e idiomas. Me gustaría actualizar un valor de clave inicial en los lenguajes de tabla, pero me arroja el error # 1451 - No se puede eliminar o actualizar una fila primaria: ¡falla una restricción de clave externa!Cómo actualizar el valor de la clave externa en la base de datos mysql

CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `name` varchar(20) NOT NULL, 
    `modified` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `languages` (
    `id` char(2) NOT NULL, 
    `name` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `categories_languages` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `category_id` int(11) unsigned NOT NULL, 
    `language_id` char(2) NOT NULL, 
    `translation` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_category_id_language_id` (`category_id`,`language_id`), 
    KEY `fk_language_id` (`language_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE; 

El error es claro para mí, pero ¿cómo puedo actualizar un valor clave en este caso? He intentado añadir EN CASCADA Updata:

ALTER TABLE `categories_languages` 
    ADD CONSTRAINT `categories_languages_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `categories_languages_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

sino que también falla con el mensaje: MySQL dijo: Documentación # 1005 - No se puede crear la tabla './db_dodo/#sql-c2f_80e6f.frm' (Error: 121)

+0

¿Cuál es la consulta de actualización que se están ejecutando que genera el error? – bobwienholt

Respuesta

40

puede suspender temporalmente la comprobación de clave externa:

SET foreign_key_checks = 0; 
UPDATE languages SET id='xyz' WHERE id='abc'; 
UPDATE categories_languages SET language_id='xyz' WHERE language_id='abc'; 
SET foreign_key_checks = 1; 

EDITAR: en cuanto al problema clave externa: son los datos almacenados en un sistema de archivos local o remoto? errno 121 es EREMOTEIO (error de E/S remotas). Tal vez haya problemas de permisos en el sistema de archivos de destino o no sea compatible con el carácter # en los nombres de archivo.

+0

Hola, gracias. ¡Esto ayudó, pude actualizar las tablas! Aún no sé por qué no puedo alterar las restricciones de la tabla para agregar la restricción ON UPDATE CASCADE ...?! –

+1

Debe BLOQUEAR las tablas antes y DESBLOQUEARlas después para evitar inserciones no válidas de otra sesión durante las ediciones. –

0

Si usted está buscando una solución temporal también se puede cambiar la acción ON UPDATE a CASCADE y modificar sus identificadores de

Cuestiones relacionadas