IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Effacement en cascade de données


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 341
    Par défaut Effacement en cascade de données
    Bonsoir,

    Suite à la lecture du topic https://www.developpez.net/forums/d2...lle-existants/ , j'ai un peu cherché à automatiser des effacements via MySQL directement.
    Une de mes recherches m'a amenée à une petite vidéo qui fait en partie ce que je souhaite faire :



    Elle parle de valeurs identiques, dans mon cas ce n'est pas le cas

    Pour vous situer un peu les tables que je compte utiliser (en cours de peaufinent, mais les champs à effacer seront là) : Table_DB.xlsx

    En fait, je profite d'une refonte de notre outil de gestion pour améliorer le fonctionnement et surtout mieux appliquer le RGPD des données de nos membres.
    Le but est d'effacer tous les enregistrements des nouvelles tables qui sont rosé (table 02_membre_rgpd -> mbr_rgpd_mbr_id) lorsque j'initialise l'effacement RGPD du membre : mon soucis est d'y adjoindre la partie 03_chien_xxx et 04_cours_reservation qui ont l'ID du chien et pas celui du membre.

    L'ordre de création des membres et chien via des formulaires :
    1. Le membre est ajouté dans 02_membre -> je récupère le dernier enregistrement
    2. La partie RGPD est créée dans 02_membre_rgpd
    3. Le chien est créé dans 03_chien -> je récupère le dernier enregistrement
    4. La partie RGPD est créée dan 03_chien_rgpd
    5. J'ajoute éventuellement des données dans les autres tables pour le membre ou le chien

    Il y a d'autres tables qui gravitent autour pour des choix dont par ex. : les codes postaux, les vétérinaires, les races, les compagnies RC familiale, ...
    Pour plusieurs j'ai choisi de mettre le nom au lieu de l'ID par facilité dans mes pages et comme c'est pour la majorité des données RGPD, ce n'est pas gourmand en taille vu les effacements : il y a presque 2.900 membres dans la DB, mais seulement +/- 250 actifs avec données RGPD et 3.300 chiens, mais seuls les chiens des membres actifs avec données RGPD.

    La table 04_cours_reservation a son origine durant la crise du Covid où il fallait réserver les cours avec des critères édictés par notre gouvernement, elle a ensuite été détournée pour des réservations de cours seulement (je garde le champs "reservation_nom" au cas où le Covid devrait revenir et ouvrir les réservations au non membre -> ils mettent leur nom ... sera vide actuellement).

    A titre d'information, mes tables sont/groupe :
    00_xxxx : la comptabilité
    01_xxxx : les données pour l'asbl (code comptabilité, taux de TVA, indemnités, etc...)
    02_xxxx : les membres
    03_xxxx : les chiens
    04_xxxx : les cours
    05_xxxx : les droits d'accès dans l'interface
    etc ...

    J'espère que c'est assez clair.

    Merci pour votre aide

    NB : je code en mode procédural et pas PDO malheureusement

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    la discussion que vous citez montre où rajouter des règles "on delete", est ce que vous avez essayez cela ?
    https://www.developpez.net/forums/d2.../#post11910122

  3. #3
    Membre chevronné Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 341
    Par défaut
    Oui, c'est en effet "on delete" que je compte utiliser : dois-je utiliser "cascade" comme dans la vidéo ?

    Dans plusieurs tables, je n'ai pas l'ID du membre que je dois effacer (bien l'ID du chien, mais la table chien a bien l'ID membre) ... dois-je l'ajouter dans ces tables (données redondantes) ? ou faire une liaison, mais comment ?
    Ajouter l'ID membre n'est pas trop difficile à faire, il est en session dès que j'ai créé un membre ou travaille sur un membre.

    C'est quelque chose de nouveau pour moi, je l'ai toujours tout fait manuellement via des requêtes, il est clair que si MySQL sait le faire pour moi, c'est mieux et certainement moins d'erreurs quand c'est bien mis en place

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 666
    Par défaut
    les champs qui sont en auto-incrément sont appelés des clés primaire, ce sont des identifiants uniques.
    ensuite les autres champs qui utilisent ces identifiants s'appellent des clés étrangères comme par exemple le champ "chien_mbr_id" dans la table 03_chien.

    en ajoutant une contrainte "on delete cascade", ça veut dire que si le membre est supprimé, cela supprimera aussi toutes les entrées correspondantes dans la table 03_chien. il faut donc rajouter cette contrainte à la table 03_chien et à toutes les tables qui utilisent des clés étrangères.

    à l'inverse si vous voulez gérer les suppression dans le code, vous pouvez mettre "on delete restrict" et au moment de supprimer un membre, la table chien va dire "non non, il y a encore des chiens associés à ce membre" et donc le membre ne sera pas supprimé et la requete de suppression retournera une erreur.
    vous pouvez voir la documentation des contraintes là :
    https://dev.mysql.com/doc/refman/8.0...eign-keys.html

  5. #5
    Membre chevronné Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 341
    Par défaut
    Merci pour ces informations.

    Les enregistrements des tables 02_membre et 03_chien ne sont jamais effacées, uniquement dans les autres tables !
    Pourquoi les garder :
    - Un membre a son n° à vie et peut revenir avec un nouveau chien ... cela arrive régulièrement et on garde l'historique du passé par la comptabilité
    - Garder le chien nous permet de détecter s'il revient avec une autre personne -> on regarde alors à qui il appartient chez DogID qui est sensé avoir tous les chiens identifiés (Puce) ... éventuellement un chien volé ?

    Je suis occupé de créer toutes les tables dans une nouvelle BDD et ferai un script qui écrira toutes les données des tables actuelles dans celles-ci.
    Dès que c'est fait, je vais faire les essais et reviendrai certainement pour l'un ou l'autre problème

    J'espère arriver à faire les effacements en cascade dans les tables ad hoc.
    S'il y a encore des points qui doivent attirer mon attention, n'hésitez pas à les dire

  6. #6
    Membre chevronné Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 341
    Par défaut
    Voilà, sans avoir beaucoup de connaissance en MySQL, avec les indication de Mathieu + des recherches, je suis parvenu à quelques chose que je dois encore tester :

    Nom : foreign_key.jpg
Affichages : 140
Taille : 200,7 Ko

    Je me suis assez vite rendu compte que je n'arrivais pas à programmer les foreign key sans qu'il y ai un champs avec le n° membre dans toutes les tables.
    Ensuite j'ai remarquer qu'il fallait créer un index partout où le N° membre n'était pas primaire afin de créer les key.
    Après pas mal d'essais et de recherches le résultat ci-dessus ... bien, maintenant il va falloir remplir les tables pour tester

    J'écris donc une query qui split la table actuelle 02_membre en 2 nouvelles tables 02_membre et 02_membre_rgpd dans une autre BDD ... un premier soucis avec le message d'erreur :
    V-.VCannot add or update a child row: a foreign key constraint fails (`table_test`.`02_membre_rgpd`, CONSTRAINT `fk_chien_rgpd` FOREIGN KEY (`mbr_rgpd_mbr_id`) REFERENCES `03_chien_rgpd` (`chien_rgpd_mbr_id`) ON DELETE CASCADE)
    Après une longue recherche, j'ajoute une ligne de code juste avant la query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_query($conn_test,"SET FOREIGN_KEY_CHECKS=0;"); // ----- Evite le blocage des "foreign key"
    Il est à noter qu'il est impossible d'ajouter directement des données dans une des tables avec cette relation, il y a le même message d'erreur

    Toutes les tables n'ont pas tous les N° membres !

    Étape suivante, je rempli d'autres tables et j’efface un N° membre de la table 02_membre_rgpd et vérifie si ce N° de membre disparait des autres tables ... ce que je cherche à faire.

    Je détaille un peu pour les autres personnes qui seraient novice comme moi et veulent faire la même chose

    EDIT : il faut que tous les champs avec le N° membre soient du même type sinon il y a un message d'erreur très explicite qui m'a nécéssité un petite recherche

Discussions similaires

  1. effacer des listes de données
    Par le_voisin dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 31/07/2008, 09h13
  2. Réponses: 4
    Dernier message: 09/05/2008, 23h44
  3. Effacer une base de données
    Par verbose dans le forum Débuter
    Réponses: 2
    Dernier message: 19/09/2007, 16h27
  4. Réponses: 2
    Dernier message: 11/10/2005, 09h15
  5. Problèmes d'effacement en cascade (HELP !)
    Par zarbydigital dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/09/2005, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo