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 MySQL Discussion :

Suppression d'un champ parent


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut Suppression d'un champ parent
    Bonjour à tous et à toutes,

    J'ai un petit problème de suppression dans ma base de données.

    Voila j'ai deux tables : une "galerie" et l'autre "image".

    J'ai fait un alter table pour mettre "id galerie" en foreign key dans image.

    Tous fonctionne sauf quand je veux effacer totalement la galerie et son contenu.

    Les images s'effacent bien mais pas la galerie.

    Est-ce que vous pourriez m’éclairer sur ce sujet s'il vous plait ?

    Merci d'avance.

    Cordialement

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 783
    Points
    23 783
    Par défaut
    Bonjour,

    Quel moteur utilisez-vous ? InnoDB, MyISAM... ?
    Quelle syntaxe avez-vous utilisez pour déclarer la clé étrangère ?
    Si vous êtes en InnoDB et que vous avez ajouté l'instruction ON DELETE CASCADE dans la déclaration de la clé étrangère, il n'y a rien de spécial à faire... la suppression d'une galerie entraîne la suppression des images associées (mais pas l'inverse).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Je suis en InnoDB effectivement et j'ai l'instruction ON DELETE CASCADE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `galerie`
    --
     
    CREATE TABLE IF NOT EXISTS `galerie` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
      `description` varchar(500) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
      `img` varchar(100) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
     
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `img`
    --
     
    CREATE TABLE IF NOT EXISTS `img` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
      `description` varchar(500) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
      `idGal` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `fk_idGal` (`idGal`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
     
    -- --------------------------------------------------------
     
    --
    -- Contraintes pour les tables exportées
    --
     
    --
    -- Contraintes pour la table `img`
    --
    ALTER TABLE `img`
      ADD CONSTRAINT `fk_parent` FOREIGN KEY (`idGal`) REFERENCES `galerie` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
    Voila mes deux tables.

    Alors si je comprends bien si je fais un delete sur ma table galerie ca va supprimer le contenu de la table img ou contenant l'id de la galerie supprimé ?

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 783
    Points
    23 783
    Par défaut
    Oui, c'est ça.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    cela fonctionne bien merci.

    Cependant si je crée une galerie et que je veux la supprimer, cela ne fonctionnera pas à condition d'avoir au moins une ligne dans la table img contenant son id.

    Y a-t-il moyen d'y remedier ?

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 783
    Points
    23 783
    Par défaut
    Si vous supprimez une galerie qui n'a pas d'image, ça fonctionnera. Simplement, comme il n'y a pas d'images rattachés à cette galerie dans la table image, aucune image ne sera supprimée (ce qui est normal).
    Ou alors, je n'ai pas compris votre question...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    vous avez bien compris

    mais j'ai essayé et cela ne fonctionne pas
    voila le code qui me permet d'effectuer la suppression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
    mysql_connect($svname, $user, $pcw);
    mysql_select_db($db);
     
    if (isset ($_POST['check'])){ 
    	$id = $_POST['check'];
    	for ($i = 0; $i < sizeof($id); $i++) {
     
    		$sql2 = "SELECT * FROM img WHERE idGal = $id[$i]";
    		$ret2 = mysql_query($sql2) or die ("Erreur de sauvegarde, Veuillez contacter votre administateur.");
     
    		while($row = mysql_fetch_assoc($ret2)){
    			$pathGrande = GRANDE.DS. str_replace(' ','',strtolower($row["name"]));
    			$pathMini = MIN.DS.str_replace(' ','',strtolower($row["name"]));
     
     
    			if (file_exists($pathMini) || file_exists($pathGrande)) {
    				unlink($pathGrande);
    				unlink($pathMini);
    			}		
     
    			$sql3 = "SELECT * FROM galerie WHERE id = $id[$i]";
    			$ret3 = mysql_query($sql3) or die ("Erreur de sauvegarde, Veuillez contacter votre administateur.");
     
    			while($row1 = mysql_fetch_assoc($ret3)){
    				$pathPres = PRES.DS. str_replace(' ','',strtolower($row1["img"]));
    				if (file_exists($pathPres)) {
    					unlink($pathPres);
     
    					$sql = "DELETE FROM galerie WHERE id = $id[$i]";
    					$ret = mysql_query($sql) or die (mysql_error());
     
    				}
    			}
    		}
    	}
    }
     
     
    mysql_close();
    ?>
    bon je suppose qu'il est loin d'être parfait mais bon

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 783
    Points
    23 783
    Par défaut
    Testez déjà en SQL pur, avant de coder en PHP, histoire de voir si le problème se situe côté SQL ou PHP...
    Ensuite, "ça ne fonctionne pas", c'est un peu vague. Qu'est-ce qui ne fonctionne pas ? Y a-t-il un message d'erreur ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    j'ai trouver le problème,

    en faite la deuxième boucle while ligne 25 à 34 je l'ai mise dans la première... alors qu'il fallait la mettre après.



    Bon en tous les cas cela fonctionne bien.

    Cependant y aurait il une possibilité d’alléger ce code ?? en faisait des jointures par exemple ou autre ???

  10. #10
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 038
    Points : 23 783
    Points
    23 783
    Par défaut
    Vous êtes sur un forum SQL et votre code est en PHP...
    Du coup, la question est : qu'attendez-vous de ce code ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    pardon, en faite je parlais pour les requetes parce que la j'en ai deux est il possible de n'en faire qu'une ?

    Je vais essayer de regarder du côté des jointures

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    bon du coup j'ai trouver comment faire avec une jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    mysql_connect($svname, $user, $pcw);
    mysql_select_db($db);
     
    if (isset ($_POST['check'])){ 
    	$id = $_POST['check'];
    	for ($i = 0; $i < sizeof($id); $i++) {
     
    		$sql2 = "SELECT img.id, img.name, img.idGal, galerie.id, galerie.img FROM img RIGHT JOIN galerie ON galerie.id = img.idGal WHERE galerie.id = $id[$i]";
    		$ret2 = mysql_query($sql2) or die ("Erreur de sauvegarde, Veuillez contacter votre administateur.");
     
    		while($row = mysql_fetch_assoc($ret2)){
    			print_r($row);
    			$pathGrande = GRANDE.DS. str_replace(' ','',strtolower($row["name"]));
    			$pathMini = MIN.DS.str_replace(' ','',strtolower($row["name"]));
                            $pathPres = PRES.DS. str_replace(' ','',strtolower($row["img"]));
     
    			if (file_exists($pathMini) || file_exists($pathGrande)) {
    				unlink($pathGrande);
    				unlink($pathMini);
    			}
    			if (file_exists($pathPres)) {
    				unlink($pathPres);
    			}
    			$sql = "DELETE FROM galerie WHERE id = $id[$i]";
    			$ret = mysql_query($sql) or die (mysql_error()."Erreur de sauvegarde, Veuillez contacter votre administateur.");
    		}
    	}
    }
    Je me sers du "right join" c'est au cas ou la galerie ne contient pas d'image cela me permet d'effectuer la suppression.

    merci encore de votre aide.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression d'un champ
    Par programeur dans le forum Bases de données
    Réponses: 10
    Dernier message: 08/05/2008, 18h38
  2. Suppression d'un champ sous une base excel
    Par kikijojo72 dans le forum JDBC
    Réponses: 3
    Dernier message: 16/08/2007, 14h53
  3. Réponses: 4
    Dernier message: 10/12/2006, 13h20
  4. Suppression d'un champs dans un etat si le champs vide
    Par franck06 dans le forum Access
    Réponses: 6
    Dernier message: 10/04/2006, 15h24
  5. Suppression d'un champ d'une bdd
    Par Kerod dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/02/2006, 22h19

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