Résolu [resolu] Jouer avec des donner mysql ^^

Solutions (10)
Tags :
  • table
  • MySQL
  • Programmation
, Programmation (collector) |
Bonjours a- tous alors voila , j'ai 3 table de donner ...

1- pour les utilisateur inscrit
2- pour les donner
3- qui mais en relation 1 et 2


alors le truc ce passe sur la table 3 !
elle es structurer de manier suivant :

----------------------
| ID | ID 1 | ID 2 |
----------------------

le but es sur une page coter admin de pouvoir " nettoyer " cette table !

le but et de supprimer dans cette table les entrée dont ID 1 n'existe plus dans la table 1
et/ou ID 2 n'existe plus dans la table 2 !

mais je ne sais pas comment m'y prendre , quelqu'un a une idée , ou une fonction que je ne connais pas qui permet de comprarer deux table ?
Contenus similaires
Meilleure solution
partage
, Ex-AdMiN |
MySQL peut utiliser plusieurs moteurs pour stocker ses données, MyISAM par défaut est relativement performant mais fait beaucoup de sacrifice dont des sacrifices sur de potentielle incohérence dans les données.

InnoDB permet de gérer les clés étrangères. Je ne pense pas avoir besoin d'évoquer le sujet, c'est de la base de chez base en SQL. Alors qu'en MyISAM on ne peut noter en dur les relations, on peut le faire avec InnoDB et le moteur refusera par exemple des supression pouvant rendre incohérent le schéma de la base.

Je vais prendre un petit exemple simple, une table articles et une tables commentaires.

On a donc un script de création des tables proche de :

  1. CREATE TABLE articles (
  2. article_id SMALLINT(4),
  3. article_content TEXT,
  4. PRIMARY KEY(article_id)
  5. ) ENGINE=MyISAM;
  6.  
  7. CREATE TABLE commentaires (
  8. commentaire_id MEDIUMINT(5),
  9. commentaire_article SMALLINT(4), #implicitement un article_id
  10. commentaire_content TEXT,
  11. PRIMARY KEY(commentaire_id),
  12. ) ENGINE=MyISAM;


Là on arrive exactement à ton problème, à savoir si on supprime un article, alors il faut automatiquement vider les commentaires liés à ce dernier. Seul hic j'ai ajouté en commentaire, on a une déclaration implicite et donc MySQL ne peut absolument pas savoir qu'il y a une relation entre commentaires et articles.

Avec MyISAM tu ne peux pas le faire mais avec InnoDB oui ! On va donc modifier un peu le code.

  1. CREATE TABLE articles (
  2. article_id SMALLINT(4),
  3. article_content TEXT,
  4. PRIMARY KEY(article_id)
  5. ) ENGINE=InnoDB;
  6.  
  7. CREATE TABLE commentaires (
  8. commentaire_id MEDIUMINT(5),
  9. commentaire_article SMALLINT(4),
  10. commentaire_content TEXT,
  11. PRIMARY KEY(commentaire_id),
  12. FOREIGN KEY(commentaire_article) REFERENCES articles(article_id)
  13. ) ENGINE=InnoDB;


Là le hic c'est qu'on va juste te refuser de supprimer un article si il a des commentaires. C'est pratique si tu veux gérer l'opération et sauvegarder, déplacer les commentaires (archiver par exemple ...). Mais ce n'est pas ce que tu veux. Pour avoir ce que tu souhaites on fait :

  1. CREATE TABLE articles (
  2. article_id SMALLINT(4),
  3. article_content TEXT,
  4. PRIMARY KEY(article_id)
  5. ) ENGINE=InnoDB;
  6.  
  7. CREATE TABLE commentaires (
  8. commentaire_id MEDIUMINT(5),
  9. commentaire_article SMALLINT(4),
  10. commentaire_content TEXT,
  11. PRIMARY KEY(commentaire_id),
  12. FOREIGN KEY(commentaire_article) REFERENCES articles(article_id) ON DELETE CASCADE
  13. ) ENGINE=InnoDB;


Bingo !


PS : Les scripts données en exemple n'ont pas été testé, si une personne à le courage de le faire et de corriger si besoin, je suis preneur.
  • Commenter cette solution |
Score
0
òh
òi
, Ex-AdMiN |
Pense à sélectionner la meilleur réponse, ça passe le topic en résolu tout seul ;) 
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
Hahahah , Voila sa marche ...
en plus je suis heureux car j'ai appris un truc sur Mysql ^^


Merci
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
oui je sais ^^ !

bon je vais tester ça on va voir si sa marche !
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Ca ressemble à ça mais faut retirer tes erreurs de syntaxe, le copier/coller c'est mal !

  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
donc si j'ai bien compris , dans ton script :
Citation :
  1. CREATE TABLE articles (
  2. article_id SMALLINT(4),
  3. article_content TEXT,
  4. PRIMARY KEY(article_id)
  5. ) ENGINE=InnoDB;
  6.  
  7. CREATE TABLE commentaires (
  8. commentaire_id MEDIUMINT(5),
  9. commentaire_article SMALLINT(4),
  10. commentaire_content TEXT,
  11. PRIMARY KEY(commentaire_id),
  12. FOREIGN KEY(commentaire_article) REFERENCES articles(article_id) ON DELETE CASCADE
  13. ) ENGINE=InnoDB;


les deux table son lier ...
si je supprime un article , les entrer dans la deuxième base qui comporte l'id de l'article seront automatiquement supprimer ....

donc dans mon cas , je recréé la base de liaison avec :

  1. CREATE TABLE hf_utilisateur (
  2. id INIT(11) * autoincrementation mais je connais pas l'argument par code sql ^^ *
  3. id_hautfait INIT(11)
  4. id_utilisateur INIT(11)
  5. timestamp BIGINT(20)
  6. PRIMARY KEY(id),
  7. FOREIGN KEY(id_hautfait) REFERENCES hf(id) ON DELETE CASCADE) ENGINE=InnoDB;
  8. FOREIGN KEY(id_utilisateur) REFERENCES utilisateur(id) ON DELETE CASCADE) ENGINE=InnoDB;


???
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Ce serait peut être pas con de montrer comment juste en SQL on peut faire les bases d'un blog dans un tuto ...
  • Commenter cette réponse |
Score
0
òh
òi
|
Ho je savais meme pas que l'on pouvait faire ce genre de relation sans se prendre la tete plutot que de coder du php / sql supplémentaire afin de gérer les suppressions des commentaires étant attaché à l'article x .
  • Commenter cette réponse |
Score
0
òh
òi
, Programmation (collector) |
Dsl du retard mais j'étais en vacance ...

heuu , oui je voudrais bien plus de détaille ...
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Conseil, utilise donc le moteur InnoDB en lieu et place du moteur MyISAM par défaut de MySQL.

En définissant correctement tes clés étrangères, tu n'auras qu'à faire un DELETE en cascade pour n'avoir aucun problème d'intégrité de tes données.

Si tu veux plus de détail demande.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS