2009-09-15 7 views
0

j'ai une colonne appelée vue dans ma table A. Je veux augmenter la colonne de vues comme ceci:valeur d'incrément MySQL de l'attribut - manque parfois

UPDATE A set views = views + 1 WHERE ID = blabla LIMIT 1; 

Cela semble être la façon de le faire (?) au moins pour moi. Ou alors j'ai pensé.

On dirait que quand je (de PHP) faire:

$views = get_viewcount($id); 
$views++: 
save_viewcount($id, $views); //here we just update views with the $views variable 

Cela fonctionne toujours. Mais porte la pénalité d'un aller-retour supplémentaire à la DB avec le get_viewcount, puis l'incrémenter en PHP et le renvoyer. Cela fonctionne toujours.

L'instruction SQL ci-dessus "parfois" fonctionne. Je sais - je déteste aussi le mot "parfois" dans la programmation - mais en d'autres termes, je ne peux pas dire QUAND mais parfois ça ne l'incrémente pas quand je le fais en SQL directement en une fois.

Suggestions?

+1

Cela semble étrange.Je m'attendrais en fait à ce que le SQL fonctionne mieux - vous avez des problèmes de concurrence avec le PHP (et si une autre demande d'utilisateur venait entre les lignes 1 et 3?). –

+0

Problème de concurrence concurrente ici. Cela doit être corrigé. – spender

Répondre

2

Vous devez isoler le bogue dans votre système. Il est très peu probable d'être un problème avec MySQL. Je suggère d'exécuter une tonne de tests, et en regardant les journaux de base de données, etc. Il est probable que la requête ne soit simplement pas exécutée en raison d'une logique dans votre système, ou en raison de la demande avant de mourir atteint la requête.

+0

ok. Merci. Je voulais juste m'assurer que le SQL que j'utilisais n'était pas hors de l'ordinaire. Maintenant, au moins, je sais qu'il y a évidemment un bug de mon côté. Merci, à vous deux de répondre. – adergaard

2

Vous devez faire quelque chose de mal.

Si vous dites mysql:

UPDATE foo SET views = views+1 WHERE id = 1337; 

il sera incrémenter.

Essayez-le sur la ligne de commande. Le code que vous utilisez pour exécuter sql échoue, pas l'instruction sql elle-même.

Et quel est le point de LIMIT = 1 sur une requête UPDATE?

+0

Le point de la limite 1 sur une requête de mise à jour est normalement d'arrêter de faire des choses stupides 'UPDATE utilisateurs SET is_superuser 1 WHERE some_complicated_condition OR 1 = 1' ou similaire. Avec 'LIMIT 1', vous minimisez les dégâts à 1 rang. –

+0

D'abord, merci pour votre réponse. Je devais attribuer la réponse à quelqu'un et j'ai choisi l'autre gars cette fois. Merci tout de même. La "limite 1" est à peu près comme Dominic dit ci-dessus, juste un précatuion de sécurité. – adergaard

+0

Je suppose que cela a du sens. Bien que cela semble être un faux sentiment de sécurité. Si les choses tournent mal, je veux qu'ils se trompent * à voix haute *, alors je le sais, tu sais? – timdev

0

Ce que je recommande de faire est de placer PHP pour renvoyer l'écho de la requête qu'il exécute, le résultat qu'il récupère, etc., etc. Tout ce que vous pouvez éventuellement. Examinez les journaux SQL, le cas échéant, pour voir quelles requêtes sont exécutées sur les tables. Fondamentalement, vous devez voir exactement le point de défaillance. Lorsque vous indiquez que l'instruction SQL fonctionne parfois, est-ce que vous appelez votre code , ou que vous êtes appelé via une invite mysql (en supposant que ce que vous utilisez)? Si c'est le précédent, avez-vous essayé de l'exécuter dans une invite de commande pour voir si vous obtenez le même résultat que votre code? Si ce n'est pas le cas, vous pouvez exclure la base de données et commencer à rechercher spécifiquement votre code.

Bonne chance!

0

Je regarderais où et quand vous faites votre traitement BEGIN TRANSACTION/COMMIT.

Il se peut que vous ne vérifiiez pas le code de retour SQL et que vous ne receviez pas d'avertissement "DEADLOCK".

Questions connexes