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

Requêtes et SQL. Discussion :

Suppression en cascade, besoin de compréhension. Merci


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut Suppression en cascade, besoin de compréhension. Merci
    Bonjour, j'essaie de comprendre pourquoi les suppressions en cascades quand le critère de sélection est deux tables "plus loin" ne fonctionne pas:
    Nom : cascade1.jpg
Affichages : 125
Taille : 80,6 Ko

    Avec ce petit exemple, j'essaie de comprendre le fonctionnement, je galère;

    Je veux supprimer tous les enregistrements de la table CLIENTS dont le critère est une ville choisie dans la table VILLES.

    En mode "sélection" aucun soucis mais en mode "suppression", j'ai à chaque fois le message : "impossible de supprimer dans les tables spécifiées" et les retours que je trouve sur le site de Microsoft et autres n'ont pas de logique (lecture seule, verrou, ...).
    Nom : cascade2.jpg.png
Affichages : 116
Taille : 7,3 Ko

    Merci de vos lumières

  2. #2
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2023
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Avril 2023
    Messages : 38
    Par défaut
    Bonjour

    "2 tables plus loin",
    la relation ville>Habitation est en "cascade", donc si tu supprimes une ville, ça supprime les habitations qui y sont
    mais si tu supprimes une habitation ça ne supprime pas un client car si la relation client>Habitation est bien en cascade, la relation habitation>client ne l'est pas

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut
    Bonjour et avant tout merci,

    çà j'avais bien compris, merci de la confirmation.
    Ce qui m'embête c'est de ne pas pouvoir suppirimer les clients qui ont une ou plusieurs habitations dans une ville.
    J'aimerais juste supprimer les clients et donc PAS les habitations et PAS les villes sur base d'une requête "ville".

    Bref, j'essaye de comprendre comment en se basant sur un critère d'une autre table, supprimer des enregistrements d'une table "parent". çà marche si je n'ai qu'une liaison mais pas deux.

    merci

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 124
    Billets dans le blog
    47
    Par défaut
    Bonsoir,

    En fait c'est parfaitement logique

    Si tu supprimes un client, le moteur d'Access va tousser tant qu'il y aura des habitations pour ce client (intégrité référentielle oblige). Si on pouvait le faire, il y aurait des habitations qui feraient référence à un client qui n'existe plus.
    Autoriser la suppression en cascade est possible, mais cela supprimerait aussi les habitations de ce client, ce qui ne va pas dans ton cas.

    Je ne comprends d'ailleurs pas pourquoi tu cherches une suppression "en cascade", alors que c'est justement ce que tu veux éviter

    Pour supprimer des clients, il faut d'abord mettre à Null le champ Client correspondant de la table Habitations (requête UPDATE), et ensuite supprimer le client dans la table Clients (requête DELETE).
    Lorsque Habitations.Client est Null, cela signifierait alors que l'habitation est disponible pour un autre client.


    Mais ici, il y a peut-être un souci de modélisation :
    Client-1-------Occuper-------1-Habitation-------1-Ville

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut
    Super, je comprends bien (par un contre exemple, c'était mon but:-)

    Donc, si la requête de sélection fonctionne bien et c'est tant mieux, ce n'est pas le cas pour la même requête en mode suppression. J'entends bien que alors l'intégrité est cassée et c'est un des objectifs de travailler en DB.
    Cependant, même si je décoche l'intégrité sur les relations, la requête suppression ne fonctionne toujours pas, refus de Access.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE Clients.*, Villes.Nom
    FROM Villes INNER JOIN (Clients INNER JOIN Habitations ON Clients.N° = Habitations.Client) ON Villes.ID = Habitations.ville
    WHERE (((Villes.Nom)="charleroi"));
    Vraiment du mal à comprendre la requête de suppression qui ne fonctionne pas si le critère est "deux tables plus loin". Si j'ai un critère dans une table en liaison directe, çà fonctionne.

    merci

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 124
    Billets dans le blog
    47
    Par défaut
    Essaie avec DISTINCTROW et supprime Villes.Nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE DISTINCTROW Clients.*, Villes.Nom
    FROM Villes INNER JOIN (Clients INNER JOIN Habitations ON Clients.N° = Habitations.Client) ON Villes.ID = Habitations.ville
    WHERE (((Villes.Nom)="charleroi"));

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut
    j'ai corrigé comme tu m'as mit et j'ai basculé en mode "affichage", le résultat est toujours bon.
    Je repasse en sql et il devenu ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE DISTINCTROW Clients.*, Villes.Nom
    FROM Villes INNER JOIN (Clients INNER JOIN Habitations ON Clients.N° = Habitations.Client) ON Villes.ID = Habitations.ville
    WHERE (((Villes.Nom)="charleroi"))
    logique car le champ villes.nom fait partie de ma sélection (il est mon critère de recherche) et

    Miracle :-) la suppression est faite

    je vais donc aller voir ce que cache ce "DISTINCTROW"

    Merci

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut
    et je trouve ceci :
    "Dans l'instruction SQL DELETE fournie, le mot-clé DISTINCTROW sert à éliminer les lignes en double des résultats de la suppression. Il garantit que seules des combinaisons uniques d'enregistrements sont supprimées, évitant ainsi la suppression de plusieurs lignes représentant les mêmes données.".

    Donc un seul enregistrement est supprimé et pourtant il pourrait y en avoir plusieurs, plusieurs clients auraient pu avoir une habitation correspondant à ma requête et dans ce cas j'aurais aimé qu'ils soient tous éliminés.

    haaaaaa ??? :-)

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 124
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par BenCharlye Voir le message
    je vais donc aller voir ce que cache ce "DISTINCTROW"
    Ou dans la fenêtre de propriétés de la requête : Enregistrements uniques = Oui

    La requête peut ramener plusieurs fois le même client, donc sans DISTINCTROW la requête cherche à supprimer plusieurs fois le même client et ça hurle... Bon, c'est quand même une bizarrerie d'Access je crois....

    Malgré tout, supprimer l'intégrité référentielle, même temporairement, reste dangereux.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut
    Après avoir beaucoup lu sur le sujet, je tire la conclusion que même si je décoche "Intégrité des données" dans la relation, ce n'est pas pour autant que tout est permis.
    Access continue de gérer une intégrité pour éviter les enregistrements orphelins.

    Exact ?

  11. #11
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 124
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par BenCharlye Voir le message
    Access continue de gérer une intégrité pour éviter les enregistrements orphelins.

    Exact ?
    Non, si tu supprimes l'intégrité référentielle, tu peux avoir des enregistrements orphelins.

    Dans ton cas, si tu supprimes un client après avoir cassé l'intégrité référentielle Clients---Habitations, tu peux avoir des habitations qui référencent un client qui n'existe plus... Embêtant, non ? Du coup, en ajoutant une nouvelle habitation, tu pourrais aussi la mettre en relation avec un client qui n'existe pas.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2024
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2024
    Messages : 7
    Par défaut
    Mon exemple, par l'absurde j'en conviens, n'est pas un bon modèle conceptuel.
    Je tentais juste de comprendre pourquoi la suppression ne fonctionne pas.
    Bref, je comprends bcp mieux, merci à vous

  13. #13
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 031
    Par défaut
    une solution à cette problématique est :
    . de stocker le résultat du SELECT dans une table temporaire (les Client_N°) via par exemple IN SELECT INTO ...
    . puis de lancer le DELETE * from CLIENTS WHERE Client_N° IN (SELECT Client_N° FROM Temp1)
    Il faut bien sûr garder l'intégrité référentielle !

Discussions similaires

  1. suppression en cascade dans formulaire et sous-formulaire
    Par tooneygirl dans le forum Access
    Réponses: 7
    Dernier message: 20/06/2005, 14h17
  2. Requetes de suppression en cascade
    Par log2n dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 20/05/2005, 10h07
  3. Suppression en cascade
    Par log2n dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/05/2005, 20h33
  4. [debutant]suppression en cascade
    Par christophebmx dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 03/05/2005, 09h51
  5. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04

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