[MySQL] INSERT / UPDATE conditionnel

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par JulienV, 1 Février 2011.

  1. JulienV
    JulienV WRInaute discret
    Inscrit:
    18 Mars 2010
    Messages:
    163
    J'aime reçus:
    0
    Bonjour à tous :)

    J'ai une table "compteur" qui se présente ainsi :

    ID_ARTICLE (l'identifiant de l'article dans la table "articles")
    DATE (type date 0000-00-00)
    COMPTEUR (le nombre de vues)

    Voici ce que j'aimerai faire :

    A chaque fois que j'affiche mon article, je dois vérifier sur la table "compteur" si une ligne avec l'ID_ARTICLE / DATE est présente.

    Si c'est le cas : je fais un UPDATE.
    Si ce n'est pas le cas : je fais un INSERT.


    Exemple en PHP :

    <?php
    // Requête de vérification
    // SELECT count(*) AS ok FROM compteur WHERE id_article=$_GET['id_article'] AND date='la date avec PHP';

    if($ok==1)
    {
    // Requête de mise à jour
    // UPDATE compteur SET compteur=compteur+1 WHERE id_article=$_GET['id_article'] AND date='la date';
    }
    else
    {
    // Requête d'insertion
    // INSERT INTO compteur SET id_article=$_GET['id_article'] AND date='la date', compteur=1;
    }
    ?>


    Simplement, voici mon problème :

    Sur certaines pages, j'affiche plusieurs articles (jusqu'à 100), et je me vois mal faire 100 "SELECT" pour vérifier la présence des lignes, puis 100 insert ou update en fonction...

    Existe-t-il une astuce pour faire un UPDATE/INSERT en fonction ?

    Merci par avance :)
     
  2. JulienV
    JulienV WRInaute discret
    Inscrit:
    18 Mars 2010
    Messages:
    163
    J'aime reçus:
    0
    Je connais la méthode "ON DUPLICATE KEY UPDATE" mais je n'ai pas de clé primaire sur cette table, la "clé primaire" serait en réalité l'association id_article/date :(
     
  3. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    En théorie, tu auras toujours plus de UPDATE que d'INSERT.
    L'astuce est de toujours effectuer UPDATE en premier.
    Lorsque tu fais une requête UPDATE, la fonction retourne le nombre de ligne qui ont été modifiée. Comme tu as "compteur+1", tu es certain de récupérer un nombre supérieur à 0.

    Donc, tu fais une truc de ce genre :
    Code:
    if (0 === mysql_query('UPDATE bla bla bla')) {
        // il n'existe pas encore d'occurence
        mysql_query('INSERT INTO bla bla bla');
    }
    
    Le problème, c'est que si en parallèle, une autre requête intervient entre les deux "mysql_query", tu auras une incohérence.
    Il faut donc gérer une contrainte UNIQUE, et vérifie l'erreur retournée par l'insertion (si c'est un "Duplicate content" tu refais UPDATE).
     
  4. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    722
    J'aime reçus:
    0
    Y a la commande "REPLACE INTO" qui pourrait aussi convenir
     
  5. Genesys
    Genesys Nouveau WRInaute
    Inscrit:
    2 Mars 2004
    Messages:
    36
    J'aime reçus:
    0
    Raison de plus pour définir une clé primaire :
    Code:
    ALTER TABLE `compteur`
    DROP PRIMARY KEY,
    ADD PRIMARY KEY (`id_article`, `date`);
    ON DUPLICATE KEY UPDATE devrait dès lors fonctionner.
     
Chargement...
Similar Threads - [MySQL] INSERT UPDATE Forum Date
[MySQL] Requête SELECT et INSERT entre 3 tables liées+Aide Développement d'un site Web ou d'une appli mobile 30 Avril 2014
[mysql] insertion si pas dans la table Développement d'un site Web ou d'une appli mobile 30 Janvier 2006
[résolu][mysql] faire un "NOT LIKE" sur une chaîne contenant des / Développement d'un site Web ou d'une appli mobile 25 Octobre 2014
[MySQL] Liste (select) avec des lignes au hasard Développement d'un site Web ou d'une appli mobile 23 Octobre 2014
[MySQL] Nombre d'enregistrements sur des horaires précis Développement d'un site Web ou d'une appli mobile 19 Juillet 2013
[MYSQL] Comment remplacer caractères dans tous les champs de toutes les tables d'une base? Développement d'un site Web ou d'une appli mobile 11 Juillet 2013
[MYSQL] Une sorte de "OR JOIN" ? Développement d'un site Web ou d'une appli mobile 5 Juillet 2013
[MySQL] sélectionner la dernière note pour chaque élève en une seule requète ? Développement d'un site Web ou d'une appli mobile 12 Avril 2012
[Mysql] Requête PDO avec variable php Développement d'un site Web ou d'une appli mobile 16 Février 2012
[Mysql] Requête PDO aléatoire Développement d'un site Web ou d'une appli mobile 7 Février 2012
[MYSQL] Tri par date Développement d'un site Web ou d'une appli mobile 7 Septembre 2011
[MySQL] rechercher une valeur dans un champ sérialisé Développement d'un site Web ou d'une appli mobile 10 Août 2011
[MySQL] Requête SELECT entre 3 tables liées Développement d'un site Web ou d'une appli mobile 10 Août 2011
[MySQL] addslashes et stripslashes Développement d'un site Web ou d'une appli mobile 9 Août 2011
[résolu] [mysql] Conditions WHERE avec AND et OR Développement d'un site Web ou d'une appli mobile 13 Mai 2011
[mysql] trier les résultats d'une requête selon une table non liée à la requête Développement d'un site Web ou d'une appli mobile 15 Avril 2011
[résolu] [mysql] passer un champ à une valeur donnée pour tous les enregistrements Développement d'un site Web ou d'une appli mobile 25 Mars 2011
[mysql] LIMIT utile sur un champ indexé ? Développement d'un site Web ou d'une appli mobile 8 Décembre 2010
[mySQL] Découper une table et gagner en performance ? Développement d'un site Web ou d'une appli mobile 9 Janvier 2010
[MySQL] Récupérer la première ligne d'un GROUP BY Développement d'un site Web ou d'une appli mobile 14 Décembre 2009