Maison >base de données >tutoriel mysql >Comment forcer InnoDB à revérifier les clés étrangères après le chargement des données ?

Comment forcer InnoDB à revérifier les clés étrangères après le chargement des données ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 08:50:09201parcourir

How to Force InnoDB to Recheck Foreign Keys After Loading Data?

Comment forcer InnoDB à revérifier les clés étrangères sur une ou plusieurs tables ?

Lors du chargement de données dans des tables avec des contraintes de clé étrangère, garantir l'intégrité référentielle est crucial. Cependant, définir FOREIGN_KEY_CHECKS sur 0 pendant le chargement peut entraîner des incohérences de données après leur réactivation.

Pour résoudre ce problème, pensez à utiliser la procédure stockée fournie : ANALYZE_INVALID_FOREIGN_KEYS.

DELIMITER $$

CREATE
    PROCEDURE `ANALYZE_INVALID_FOREIGN_KEYS`(
        checked_database_name VARCHAR(64), 
        checked_table_name VARCHAR(64), 
        temporary_result_table ENUM('Y', 'N'))

    LANGUAGE SQL
    NOT DETERMINISTIC
    READS SQL DATA

    BEGIN
        DECLARE VARIABLES...

        OPEN foreign_key_cursor;
        foreign_key_cursor_loop: LOOP
            FETCH foreign_key_cursor INTO 
            TABLE_SCHEMA_VAR, 
            ...

            SET @from_part = CONCAT(...);
            SET @full_query = CONCAT(...);
            PREPARE stmt FROM @full_query;

            EXECUTE stmt;
            IF @invalid_key_count > 0 THEN
                INSERT INTO 
                    INVALID_FOREIGN_KEYS 
                SET 
                    `TABLE_SCHEMA` = TABLE_SCHEMA_VAR, 
                    ...

            END IF;
            DEALLOCATE PREPARE stmt; 

        END LOOP foreign_key_cursor_loop;
    END$$

DELIMITER ;

Cette procédure analyse tous clés étrangères et identifie toutes les lignes qui les violent. Les résultats sont stockés dans la table INVALID_FOREIGN_KEYS.

Pour utiliser cette procédure :

  • Exécutez CALL ANALYZE_INVALID_FOREIGN_KEYS('%', '%', 'Y'); pour analyser l'intégralité de la base de données.
  • Remplacez '%' par des modèles de base de données et de table spécifiques pour affiner la portée.
  • Spécifiez 'N' pour Temporary_result_table pour stocker les résultats dans une table permanente.

Notez que cette procédure nécessite des index sur les colonnes référencées et référencées pour des performances optimales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Convention d'extension .pyArticle suivant:Convention d'extension .py