[MySQL] INSERT / UPDATE conditionnel

JulienV
WRInaute discret
WRInaute discret
 
Messages: 156
Inscription: 18 Mar 2010

[MySQL] INSERT / UPDATE conditionnel

Message le Mar Fév 01, 2011 11:04

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 :)

JulienV
WRInaute discret
WRInaute discret
 
Messages: 156
Inscription: 18 Mar 2010

Re: [MySQL] INSERT / UPDATE conditionnel

Message le Mar Fév 01, 2011 11:06

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 :(


Blount
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 430
Inscription: 18 Nov 2010

Re: [MySQL] INSERT / UPDATE conditionnel

Message le Mar Fév 01, 2011 11:26

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: Tout sélectionner
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).


seebz
WRInaute impliqué
WRInaute impliqué
 
Messages: 808
Inscription: 15 Avr 2007

Re: [MySQL] INSERT / UPDATE conditionnel

Message le Mar Fév 01, 2011 12:27

Y a la commande "REPLACE INTO" qui pourrait aussi convenir

Genesys
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 32
Inscription: 2 Mar 2004

Re: [MySQL] INSERT / UPDATE conditionnel

Message le Mar Fév 01, 2011 13:49

JulienV a écrit: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 :(


Raison de plus pour définir une clé primaire :
Code: Tout sélectionner
ALTER TABLE `compteur`
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id_article`, `date`);


ON DUPLICATE KEY UPDATE devrait dès lors fonctionner.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité