7

Estoy introduciendo la integridad de la base de datos utilizando restricciones innodb en la próxima versión de mi aplicación. Todo va bien, pero algunas de mis tablas tienen registros con referencias eliminadas (registros muertos) y debido a ellos no puedo agregar restricciones a la tabla.Manejo de la integridad de la base de datos

Estoy tratando:

ALTER TABLE `article` ADD FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE; 

Y consigo:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`books`.<result 2 when explaining filename '#sql-442_dc'>, CONSTRAINT `#sql-442_dc_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE) 

ejecución de esta consulta, descubrí que más de 500 registros no tienen referencias (se eliminaron los autores, pero se mantuvieron sus artículos) :

SELECT `articles`.`id` 
FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id` 
WHERE ISNULL(`authors`.`id`); 

Entonces, antes de que pueda agregar una restricción, debo lidiar con ellas. ¿Cómo borro todos los registros que obtengo usando la consulta anterior?

He intentado:

DELETE FROM `articles` WHERE `id` IN (
    SELECT `articles`.`id` 
    FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id` 
    WHERE ISNULL(`authors`.`id`); 
) 

Pero MySQL responde:

You can't specify target table 'articles' for update in FROM clause 

Cualquier ayuda en esto será apreciado considerablemente.

+0

Vea allí: http://stackoverflow.com/questions/4770035/handling-database-integrity (duplicado) – Benj

+0

@Benj ¿Por qué su enlace apunta a esto ** exacto ** SO poste? –

+0

@BuhakeSindi Bueno ... parece que no pude copiar y pegar ... Gracias por señalarlo. Lo siento, no puedo (años después) recuperar el enlace original. – Benj

Respuesta

14

No estoy muy familiarizado con muchas peculiaridades de MySQL, pero esto también debería funcionar, y quizás MySQL no ahogarse en él:

delete from articles 
where not exists (
      select id from authors 
      where authors.id = articles.author_id 
     ) 

Um, por supuesto, que siempre tiene una copia de seguridad de la tabla antes de intentar las eliminaciones basadas en conjuntos :)

+0

+1, No hay necesidad de publicar mi duplicado exacto :) – Ronnis

+0

+1 o el mío tampoco. –

+0

¡Gracias, esto funcionó para mí! Ya he encontrado una solución fea usando una tabla temporal, pero esta es una pregunta :) Dejaré una pregunta abierta durante un tiempo para que puedas obtener más votos positivos :) –

Cuestiones relacionadas