[MySQL] INSERT / UPDATE conditionnel
5 messages
• Page 1 sur 1
- JulienV
- WRInaute discret

- Messages: 156
- Inscription: 18 Mar 2010
[MySQL] INSERT / UPDATE conditionnel
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
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
-

Blount - WRInaute occasionnel

- Messages: 430
- Inscription: 18 Nov 2010
Re: [MySQL] INSERT / UPDATE conditionnel
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 :
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).
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).
- Genesys
- Nouveau WRInaute

- Messages: 32
- Inscription: 2 Mar 2004
Re: [MySQL] INSERT / UPDATE conditionnel
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.
5 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- INSERT ou UPDATE : Mysql
- L'insert conditionnel est-il possible avec mysql ?
- [mysql+php] Insert....select et modifications au passage
- Afficher les 10 derniere insert d'une table Mysql avec php ?
- update mysql
- Fonction update mysql
- Update / Select et Mysql
- UPDATE TABLE MYSQL !
- update champs mysql
- Mysql ON DUPLICATE KEY UPDATE
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

