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

Contribuez MySQL Discussion :

La FAQ MySQL - commentaires & suggestions


Sujet :

Contribuez MySQL

  1. #1
    Membre émérite
    Avatar de yiannis
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 494
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 494
    Points : 2 791
    Points
    2 791
    Par défaut La FAQ MySQL - commentaires & suggestions
    La FAQ MySQL a subi un gros lifting : passage au format standard Développez.com, ajout de plus de 50 questions/réponses ; elle est désormais disponible à l'adresse : http://mysql.developpez.com/faq/.

    J'ai également le plaisir de remplacer Florian en tant que responsable de la FAQ, contactez-moi pour toute question, suggestion, critique...
    Les nouvelles Q/R ont été conçues à partir des questions fréquemment posées sur le forum ; nous espérons ainsi que cette FAQ répondra à vos problèmes les plus courants.

    D'autre part n'hésitez pas à poster vos propositions de Questions avec les réponses dans cette enfilade, vous pourrez de cette manière contribuer à son évolution.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Excellentissime, ça fait une heure que je cherche une fonction de date.

    Je viens de la trouver en 2 minutes...

    Bravo et merci!

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Points : 65
    Points
    65
    Par défaut
    tres bonne faq qui convient aux debutants qu'aux personnes un peu plus expérimentées je constate avec joie que developpez.com est toujours une source sure pour les recherches

  4. #4
    Membre du Club

    Inscrit en
    Octobre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 50
    Points : 67
    Points
    67
    Par défaut
    Salut,


    Je regarde cette faq pour la première fois.
    J'y voit plein d'infos intéressantes.
    J'y voit pas la réponse à mon problème: comment interfacer une appli ASP.NET avec MySQL, quel driver utiliser?
    Une info qui pourrait intéresser pas mal de gens!

    Philippe

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Points : 180
    Points
    180
    Par défaut
    Trés bonne FAQ, relativement complete.
    Est-il prévu de rajouter des infos sur MaxDB ?

    pour le lynx, il existe un driver ODBC pour MySQL qui te permet d'interfacer MySQL avec une appli .net. Tu peux le trouver ici.

  6. #6
    Membre du Club

    Inscrit en
    Octobre 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 50
    Points : 67
    Points
    67
    Par défaut
    Oui, et il y a aussi cet article sur une connexion OLEDB
    http://morpheus.developpez.com/MySQLDotNet/
    A mon avis la FAQ devrait intégrer un pointeur vers ces 2 sources d'info.
    Philippe

  7. #7
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Bonjour,

    Bon je débute encore avec MYSQL et dans le cadre d'un TP, on doit l'utiliser (sous EasyPHP 1.6) et comme je cherchais comment utiliser les transactions, en fouillant l'aide j'ai touvé cette solution. Voilà si elle vous semble interessante....

    Testé sous EasyPHP 1.6 qui utilise la version 3.23.49 de MySQL.
    [QR]Utiliser les transactions sous MySQL 3.23.xxx

    Le format par défaut des tables crées sous EasyPHP ne supporte pas les transactions (MyISAM). Il faut utiliser un format comme InnoDb qui n'est pas activé par défaut sous MySQL 3.23.xx, par exemple le serveur MySQL fournit avec EasyPHP 1.6 et en général pour les versions inférieures à la 4.1.

    Avant toute chose, il convient de connaître les moteurs de stockage supportés par votre serveur. Utilisez la commande et regardé la valeur de la variable have_innodb. Si celle-ci vaut No, cà ne vaut pas peine de continuer, si c'est Yes, vous pouvez d'ores et déjà créer des tables de ce format. Le paragraphe qui suit traite du cas où vous aurez la valeur Disabled qui signifie que le serveur supporte cette fonctionnalité mais qu'elle n'est pas activée.

    Il existe deux possibilités :
    1/se procurer le serveur MySQL-MAX qui est une version de MySQLd compilée avec --with-innodb qui active le support de InnoDb
    2/configurer le fichier my.ini situé dans <HOMEDRIVE>\Windows

    Pour réaliser la seconde solution, il faut aller dans le fichier my.ini et effacer (si elle existe) la ligne --skip-innodb et la remplacer au moins par l'option innodb_data_file_path qui spécifie le chemin des bases Innodb. par défaut, le repertoire de base sera celui où mysql stocke les données. Sinon utilisez innodb_data_home_dir pour spécifier un repertoire.

    Voilà, vous n'avez plus qu'à redémarrer le serveur et utilisez les instructions Begin (pour les versions de MySQL antérieures à la 4.0.11) ou Start transaction, commit pour valider les données et Rollback pour les annuler.
    A+

  8. #8
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    FAQ mise à jour avec les Q/R de le lynx, ren0 et King Kaiser.


  9. #9
    Membre éclairé
    Avatar de Eric Berger
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2002
    Messages : 346
    Points : 663
    Points
    663
    Par défaut
    Proposé par berceker united dans la rubrique PHP
    Citation Envoyé par berceker united
    Un INSERT comme un UPDATE (Mysql) ?

    Les insert sont de cette forme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ma_table (mes_champs) VALUES (mes_valeurs)
    Mais vous pouvez le faire a la forme update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT ma_table SET (mes_champs = mes valeurs)
    Attention ceci est propre à Mysql et ne fait pas partie de la Norme SQL

  10. #10
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Moi ce que je voudrais savoir c'est l'avantage de cette méthode au insert traditionnel....

  11. #11
    Membre éclairé
    Avatar de Eric Berger
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2002
    Messages : 346
    Points : 663
    Points
    663
    Par défaut
    certains trouveront peut-être plus lisible d'avoir des paires champ/valeur plutôt que d'avoir les champs puis les valeurs.... sinon personellement je n'y vois pas d'avantages.

  12. #12
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 088
    Points
    6 088
    Par défaut
    Il peut y avoir un petit avantage lorsqu'ont souhaite faire des requêtes dynamiquements.
    D'un coté il y a la relation champs=valeur et en parametre c'est soit update ou insert pas la peine d'écrire deux fois champs et valeur. Ainsi c'est plus facile pour la maintenance tous est centralisé au même endroit.
    Exemple :
    $req = "champs1=1,champs2=3,champ3=556";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($id>0) mysql_query('UPDATE maTable SET'.$req.' WHERE id='.$i);
    else mysql_query('INSERT maTable SET '.$req);

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 82
    Points : 71
    Points
    71
    Par défaut Quick references Mysql
    Bonjour,

    Je me permet de vous recommander ce lien:
    http://www.digilife.be/quickreferenc...ySQL-4.02a.pdf

    Il s'agit des principales commandes Mysql sur une page recto-verso.

    Marco

  14. #14
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Voici une proposition pour la FAQ

    Q :
    Comment rendre le champ d'une table dépendante d'une autre (comment lier 2 tables) ?

    R :
    Pour pouvoir lier 2 champs, il faut d'abord que les 2 conditions suivantes soient réunies :
    - les 2 champs doivent constituer la première colonne d'un index
    - les 2 champs doivent avoir le même format. Inutile de chercher à lier un champ VARCHAR(10) avec un champ VARCHAR(15). Inutile aussi de chercher à lier deux champs dont l'interclassement est différent (et en plus, c'est une source d'erreur pas facile à trouver).

    Selon le type de relation désiré, on peut décider ce qui arrive lorsque l'on effectue une action sur un enregistrement dans la table MERE :
    - les actions envisagées sont DELETE et UPDATE
    - les conséquences sur la table FILLE sont, pour chaque action : CASCADE (on efface/met à jour aussi la table FILLE), SET NULL (on met à NULL), NO ACTION (on ne fait rien) et RESTRICT (merci à quelqu'un de compléter, j'ignore ce que ça fait).

    Ensuite, supposons 2 tables MERE et FILLE.
    Pour que le champ NOM_FILLE de la table FILLE dépende du champ NOM_MERE de la table MERE, il faut effectuer la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `FILLE`
      ADD CONSTRAINT `FILLE_contrainte` FOREIGN KEY (`NOM_FILLE`) REFERENCES `MERE` (`NOM_MERE`) ON DELETE CASCADE ON UPDATE CASCADE
    Pour plus de théorie sur les bases relationnelles, n'hésitez pas à lire les cours de www.developpez.com

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Points : 71
    Points
    71
    Par défaut Dernier enregistrement d'une table
    Encore une petite proposition :

    J'avais chercher sur le forum et sur la faq comment réccupérer le dernier enregistrement inséré, et je n'ai pas trouvé ce que je cherchais...

    Voici ma méthode, qui peux parfois être pratique dans certains cas, le mien est tordu, je dois l'admettre, mais elle peut être utile sur la faq :

    J'ai une base de donnée qui contient une clée primaire de référence de livre.

    Les enregistrements ne se suivent pas tous et il y a plusieurs catégories de livres.
    certains ont leur référence qui est comprise entre 0 et 200000 d'autre entre 300000 et 400000. ect...

    Ce n'est pas super, mais cela permet d'identifier rapidement la catégorie du livre selon la référence.

    Il n'y a pas d'AUTO_INCREMENT dans ma table, car il faut parfois saisir des livres dans une catégorie, et parfois dans d'autres catégories.

    Par défaut, sur une nouvelle fiche d'ouvrage, il est pratique d'avoir la derniere référence saisie incrémenté de 1.

    Voici donc les deux requêtes qui permettent de réccupérer le réel dernier enregistrement :

    SELECT COUNT(*) FROM `ma_table` WHERE 1;
    SELECT mon_dernier_enregistrement FROM `ma_table` LIMIT le_resultat_precedant, 1;

    Voila, ca peut toujours servir !

  16. #16
    Membre éprouvé
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Points : 1 084
    Points
    1 084
    Par défaut
    J'ai été récemment confronté au douleureux probleme de perte du mot de passe ROOT !!

    Voici le moyen de changer un mot de passe ROOT perdu:

    # Arrêter le serveur MySQL en tapant :
    /etc/rc.d/init.d/mysql stop

    # Redémarrer le server avec les options ci-dessous:
    /usr/bin/safe_mysqld —skip-grant-tables —skip-networking &

    # Ce connecter au serveur mysql avec :
    mysql mysql

    # Taper la ligne suivante (ou ’nouveau_mot_passe’ est le nouveau mot de passe) :
    UPDATE user SET password=PASSWORD(’nouveau_mot_passe’) WHERE User="root" AND Host="localhost" ;

    # Eteindre le serveur MySQL
    mysqladmin shutdown

    # Redémarrer le serveur correctement avec :
    /etc/rc.d/init.d/mysql start

  17. #17
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 088
    Points
    6 088
    Par défaut Comment optimiser une requête utilisant le limit
    L'utilisation d'un limit sur une ou des tables ayant beaucoup d'enregistrements peut énormement plomber le serveur. Surtout si vous retourner des gros contenu avec beaucoup sur des petites intervale de page. Par exemple un forum qui retourne 30 enregistrements et le pire c'est l'ajout de l'ORDER BY qui ici achève le CPU mais qui est quasi obligatoire.

    Pour optimiser les performances il faut deux requêtes.
    La première requête utilise le LIMIT mais ne retourne que les index.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idtopic FROM forum ORDER BY date LIMIT 100,130;
    De là, nous avons une suite d'index dans l'ordre.
    Dans la second requête vous utilisez la fonction IN(...). IN permet d'insérer un suite de valeur que vous souhaiter retourner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM forum WHERE idtopic IN(100,101,102,103,...);
    Sur des gros enregistrements vous sentirez la différence. J'en suis arrivé en faisant des test de volume. Arrivé à 100 000 enregistrements ça rame énormement avec le LIMIT intervale 30 + ORDER BY + champs TEXT et autres. Le temps d'affichage n'est pas acceptable pour le web. Venice 3200+ 1Go Mysql5 XP.

    Avec cette méthode c'est totalement liquide.

  18. #18
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Excellente méthode berceker united !

    Je viens de tester sur une base de données médiocrement modélisée et cela me donne de bons résultats. Par contre, sur une base correctement modélisé (taille d'enregistrement fixe, index ordonné), le gain est nul.

    Néanmoins, je changerais les valeurs de votre second exemple. Certains débutants pourrait faussement comprendre qu'il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT *  FROM forum LIMIT 100,30
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT * FROM forum WHERE id_topic IN (100, 101, 102, 103...., 128, 129, 130)

    Donc je conseillerais ces exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idtopic  FROM forum LIMIT 100,30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM forum WHERE idtopic IN(100,106,108,110,...,166,170);
    en précisant que la première requête à retourner 100,106,108,110,...,166,170

  19. #19
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    big_ben3333, je ne pense pas que votre solution soit apportée à la FAQ. En effet, elle résulte plus à mon sens d'une réflexion pour contourner des problèmes créés par une base très mal modélisé.

    Il existe des bases mal modélisé, et certaines astuces sont utiles, mais votre cas est assez particulier. De plus on peut planter votre méthode dans le cas d'utilisateurs réalisant des opérations simultanément ce qui est fréquent sur le web !

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    12h00m44secondes 034ms - utilisateur 1 insère le livre 1
    12h10m44secondes 080ms - utilisateur 1 insère le livre 2
    12h15m14secondes 034ms - utilisateur 2 insère le livre 3
    12h15m44secondes 041ms - utilisateur 1 insère le livre 4
    45 millisecondes après l'insertion du livre 2 vous exécuter votre méthode pour récupérer la valeur du livre 3.
    Si l'utilisateur 1 à inséré son livre 4 pendant cet intervalle de 45 millisecondes, votre algorithme retourne 4 et non 3 !
    Et la méthode avec LAST_INSERT_ID, elle, permet d'éviter les accès concurrents.

    Néanmoins, je vous remercie de votre aide et n'hésitez SURTOUT pas à nous conseiller d'autres questions-réponses

  20. #20
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 088
    Points
    6 088
    Par défaut
    Citation Envoyé par Alexandre T
    Excellente méthode berceker united !

    Je viens de tester sur une base de données médiocrement modélisée et cela me donne de bons résultats. Par contre, sur une base correctement modélisé (taille d'enregistrement fixe, index ordonné), le gain est nul.

    Néanmoins, je changerais les valeurs de votre second exemple. Certains débutants pourrait faussement comprendre qu'il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT *  FROM forum LIMIT 100,30
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT * FROM forum WHERE id_topic IN (100, 101, 102, 103...., 128, 129, 130)

    Donc je conseillerais ces exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idtopic  FROM forum LIMIT 100,30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM forum WHERE idtopic IN(100,106,108,110,...,166,170);
    en précisant que la première requête à retourner 100,106,108,110,...,166,170
    Oui je comprend que cela puisse préter à confusion avec "idtopic". J'ai fais des test sur une table ayant plus de 100 000 enregistrements avec des champs TEXT de gros volume, j'ai constaté qu'il y a un gain. Sur un autre forum j'ai vu que c'étais une méthode à conseiller sur les forum.
    Il faut pas utiliser cette methode à toute les sauces.

Discussions similaires

  1. Nouvelle FAQ OpenGL en ligne : commentaires et suggestions
    Par LittleWhite dans le forum OpenGL
    Réponses: 7
    Dernier message: 02/05/2016, 20h54
  2. Réponses: 14
    Dernier message: 22/03/2013, 22h13
  3. Nouvelle FAQ DirectX en ligne : commentaires et suggestions
    Par LittleWhite dans le forum DirectX
    Réponses: 5
    Dernier message: 13/10/2009, 10h26
  4. les sources MySQL - commentaires & suggestions
    Par Alain Defrance dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/11/2008, 13h22
  5. Nouvelle FAQ Prog 3D en ligne : commentaires et suggestions
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 20/08/2008, 20h50

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