Dans MySQL, puis-je reporter les vérifications d’intégrité référentielle jusqu’à la validation

Comme dans cette question , j’ai lu PoEAA et je me demandais s’il était possible de reporter les vérifications d’intégrité référentielle jusqu’à la validation dans MySQL.

J’ai rencontré ce problème en voulant insérer un tas de produits et de produits connexes dans le même commit. Même dans une transaction, j’obtiens des erreurs de contrainte lorsque j’essaie d’insérer dans la table de jointure related_products .

Si cela aide, j’utilise PHP PDO pour les connexions de firebase database.

J’apprécierais toute aide que vous pourriez offrir.

On dirait que ma réponse est ici …

Comme MySQL en général, dans une instruction SQL qui insère, supprime ou met à jour de nombreuses lignes, InnoDB vérifie les contraintes UNIQUE et FOREIGN KEY ligne par ligne. Lors de la vérification des clés étrangères, InnoDB définit des verrous de niveau de ligne partagés sur les enregistrements enfants ou parents qu’il doit examiner. InnoDB vérifie immédiatement les contraintes des clés étrangères; la vérification n’est pas rescope à la validation de la transaction. Selon le standard SQL, le comportement par défaut doit être une vérification différée. En d’autres termes, les contraintes ne sont vérifiées qu’une fois que l’instruction SQL complète a été traitée. Tant qu’InnoDB n’aura pas implémenté la vérification des contraintes différées, certaines choses seront impossibles, telles que la suppression d’un enregistrement se référant à lui-même à l’aide d’une clé étrangère.

Retour à la planche à dessin.

Si vous demandez si MySQL supporte l’atsortingbut DEFERRABLE pour les clés étrangères (y compris l’option INITIALLY DEFERRED ), alors la réponse est claire non.

Vous ne pouvez pas différer la vérification des contraintes avant la validation dans MySQL.

Et, comme vous l’avez déjà souligné, ils sont toujours évalués au “niveau des lignes” et non au “niveau des instructions”.

Vous pouvez gérer cette limitation du moteur innodb en désactivant temporairement les contrôles de clé étrangers en définissant la variable de serveur:

 set foreign_key_checks=0; 

A partir du manuel MySQL:

mysqldump produit également des définitions correctes des tables dans le fichier de vidage, et n’oublie pas les clés étrangères.

Pour faciliter le rechargement des fichiers de vidage pour les tables ayant des relations de clé étrangère, mysqldump inclut automatiquement une instruction dans la sortie de vidage pour définir foreign_key_checks à 0. Cela évite les problèmes de rechargement des tables dans un ordre particulier lors du rechargement de la sauvegarde. Il est également possible de définir cette variable manuellement:

 mysql> SET foreign_key_checks = 0; mysql> SOURCE dump_file_name; mysql> SET foreign_key_checks = 1;