2009-04-10 1 views
0

J'ai une table dans MS SQL 2005. Et voudrais faire:Comment contrôler l'ordre de l'exécution de la requête de mise à jour?

update Table 
set ID = ID + 1 
where ID > 5 

Et le problème est que ID est la clé primaire et quand je fais cela je une erreur, parce que quand cette requête vient à la ligne avec l'ID 8, il essaie de changer la valeur en 9, mais il y a une ancienne ligne dans cette table avec la valeur 9 et il y a une violation de contrainte.

Par conséquent, je voudrais contrôler la requête de mise à jour pour s'assurer qu'il est exécuté dans l'ordre décroissant.

Donc non pour ID = 1,2,3,4 et ainsi de suite, mais plutôt ID = 98574 (ou autre) et ensuite 98573, 98572 et ainsi de suite. Dans cette situation, il n'y aura pas de violation de contrainte.

Alors, comment contrôler l'ordre d'exécution de la mise à jour? Existe-t-il un moyen simple d'accomplir cela par programme?

Répondre

2

Transact SQL

Voilà pourquoi cette requête:

UPDATE mytable 
SET  id = CASE WHEN id = 7 THEN 8 ELSE 7 END 
WHERE id IN (7, 8) 

ne manquera pas, si elle permute de 7 et 8id.

Il semble que certaines valeurs en double soient conservées après la fin de la requête.

+0

Vous avez raison. Mon erreur! –

1

Essayez ceci:

update Table 
set ID = ID * 100000 + 1 
where ID > 5 

update Table 
set ID = ID/100000 
where ID > 500000 
+0

Je pense que + 1 devrait être fait lors de la deuxième mise à jour. – ybo

0

Ne pas oublier la parenthèse ...

mise à jour Tableau set ID = (ID * 100000) + 1 où ID> 5

Si les identifiants deviennent trop gros ici, vous pouvez toujours utiliser une boucle. Diffère la vérification des contraintes jusqu'à ce que l'instruction se termine.

0

Personnellement, je ne voudrais pas mettre à jour un champ d'identification de cette façon, je voudrais créer une table de travail qui est l'ancienne à la nouvelle table. Il stocke les deux ID, puis toutes les mises à jour sont effectuées à partir de cela. Si vous n'utilisez pas la suppression en cascade (qui pourrait d'ailleurs verrouiller vos tables pendant une longue période), alors commencez avec les tables enfants et travaillez, sinon commencez par la table pk. Ne le faites pas, sauf si vous êtes en mode mono-utilisateur ou si vous rencontrez des problèmes d'intégrité des données si d'autres utilisateurs changent de configuration alors que les tables ne sont pas cohérentes.

Les PK ne sont pas à tromper avec le changement et si possible, ne devrait pas être changé. Avant d'apporter des modifications aux données de production de cette manière, veillez à effectuer une sauvegarde complète. Cela peut vous coûter votre travail si vous ne pouvez pas récupérer.

Questions connexes