2010-06-15 4 views
0

J'ai une très grande table avec beaucoup de lignes, chaque ligne a des statistiques pour chaque utilisateur pour certains jours. Et évidemment, je n'ai pas de statistiques pour l'avenir. Donc, pour mettre à jour les statistiques que j'utiliseQuestion sur l'insertion/mise à jour des lignes avec SQL Server (ASP.NET MVC)

UPDATE Stats SET [email protected] WHERE ... a lot of conditions ... AND [email protected] 

Mais que se passe-t-il si la ligne n'existe pas? Je devrais utiliser

INSERT INTO Stats (...) VALUES ([email protected], ..., [email protected]) 

Comment puis-je vérifier si la ligne existe ou non? Y a-t-il un moyen différent de faire le COUNT (*)?

Si je remplis la table avec des cellules vides, il faudrait des centaines de milliers de lignes prenant des mégaoctets et ne stockant aucune donnée.

Répondre

0

Ce que je tends à faire dans ces cas est simplement effectuer les opérations suivantes (pseudo-code car je suis moi-même homme DB2):

try: 
    INSERT 
catch already-exists: 
    try: 
     UPDATE 
    catch anything: 
     generate error 

Vous pouvez le faire dans l'ordre inverse si vous êtes plus susceptibles d'avoir des lignes qu'improbable:

try: 
    UPDATE 
catch not-there: 
    try: 
     INSERT 
    catch anything: 
     generate error 

vous jamais premier test dans un SGBD depuis la base de données peut changer und Vous êtes entre le test et l'exécution (le principe «mieux vaut demander pardon que demander la permission»).

0

Malheureusement, SQL Server n'a aucune sorte de commande "INSERT OR UPDATE" (que je connais), comme certains moteurs DB. Cela signifie que vous devez d'abord vérifier la ligne ou détecter l'erreur, comme d'autres réponses le recommandent. Heureusement, votre ligne a une clé primaire artificielle, ce que vous pouvez faire est d'abord une requête pour cette clé en utilisant toutes vos conditions WHERE et ensuite, si une ligne est retournée, faites un UPDATE ... WHERE key = ..., sinon faites un INSERT. De cette façon, vous n'exécutez pas toute la requête deux fois.

+4

SQL Server 2008 ne vous! http://technet.microsoft.com/fr-fr/library/bb510625.aspx –

+0

Intéressant - merci! Ce n'est pas tout à fait évident et pas aussi facile à écrire qu'il pourrait l'être, mais cela résout le problème. – EMP