2014-07-02 3 views
0

J'ai une requête UPDATE avec une clause ORDER BY. J'ai copié la même requête à SELECT avec la même clause ORDER BY et j'obtiens des résultats différents.ordre de mise à jour par clause de commande différente puis sélectionnez ordre par

Requête Mise à jour:

UPDATE t_locks 
SET server_guid = 11028790, 
lock_time_to_live = TIMESTAMPADD(MINUTE,5,NOW()) 
WHERE 
(server_guid IS NULL OR NOW() > lock_time_to_live OR lock_time_to_live IS NULL) 
AND lock_key_id = 3 
ORDER BY flag DESC, last_time_processed ASC 
LIMIT 10; 

Sélectionner une requête:

SELECT * FROM t_locks 
WHERE 
(server_guid IS NULL OR NOW() > lock_time_to_live OR lock_time_to_live IS NULL) 
AND lock_key_id = 3 
ORDER BY flag DESC, last_time_processed ASC 
LIMIT 10; 

Note: Je ne vérifie pas les résultats de l'UPDATE avec ce SELECT. Suspect: En plus de la ORDER BY normale dans la requête SELECT, il ajoute un troisième paramètre qui est ID. Je m'attendrais à ce que le UPDATE fasse la même chose.

+0

Vérifiez s'il y a des actions de déclenchement définies sur 't_locks'? –

+0

@Ravinder Il n'y en a pas. – BrainPicker

Répondre

0

Les bases de données SQL n'ajoutent rien au order by. Pour de bonnes raisons, SQL n'implémente pas un tri stable. La bonne raison est que les tables représentent des ensembles non ordonnés, donc il n'y a pas de ligne de base pour l'ordre de tri. Si vous commandez par une constante, vous n'êtes pas garanti d'obtenir le même ordre deux fois de suite. Les liens peuvent apparaître dans n'importe quel ordre. Et ils le font.

Ce que vous venez d'apprendre est que vous avez des doublons basés sur flag et last_time_processed. Il n'est pas clair à partir de votre question si vous avez 11 ou plus avec les mêmes valeurs, ou seulement deux qui sont aux positions 10 et 11 pour le select mais 11 et 10 pour le update.

Il se trouve que SQL Server documentation fait un meilleur travail d'expliquer ce (dans le contexte de la pagination) que MySQL:

Pour obtenir des résultats stables entre les demandes de la requête. . . les conditions suivantes doivent être remplies:

. . .

  1. La clause ORDER BY contient une colonne ou une combinaison de colonnes qui sont garanties être uniques.
+0

J'ai 100-200 lignes avec les mêmes valeurs. Mon 'select' est cohérent avec ses résultats et la même chose avec' update'. Si je ajoute manuellement un 'ORDER BY id ASC' dans ma requête' UPDATE', les résultats correspondent. – BrainPicker

+0

@BrainPicker. . . Ajoutez ensuite 'id' à' order by' pour les deux requêtes. Il n'y a aucune garantie sur la commande des clés qui correspondent. –

+0

Le 'ORDER BY id' n'est pas quelque chose d'important pour moi. Je demandais pourquoi le 'select' avait des résultats cohérents mais différents de ceux de' update'. – BrainPicker