2010-06-08 6 views
3

J'ai une question très simple, est-il possible de mettre à jour une table avec de nouvelles valeurs en utilisant une seule instruction de mise à jour.Aide de mise à jour SQL

Dire par exemple que j'ai une table avec l'auteur, le titre, la date, la popularité. Maintenant, j'ai eu de nouvelles données qui ont un nom d'auteur, titre correspondant nouvelle popularité. Comment mettre à jour la table maintenant dans une instruction. Notez que l'auteur et le titre ne sont pas uniques.

+0

Voulez-vous dire « insérer la valeur si elle est pas là ou mise à jour si elle est là »? Ou voulez-vous seulement mettre à jour les enregistrements existants? Si oui, @icktoofay a la réponse. – jcolebrand

+0

si aucune valeur n'est là .. alors nous devons l'insérer, si elle est là .. puis le mettre à jour. –

+2

~ Quelle plateforme SQL? T-SQL (Microsoft), MySQL, Oracle, NoSQL, etc ... – jcolebrand

Répondre

4

Vous pouvez le faire dans une déclaration unique à l'aide de la déclaration MERGE d'Oracle:

MERGE DestinationTable target 
USING (
     Select 'Briggs' Author, 'My Next Master' Title, 6 Popularity 
     Union All Select 'Millis', 'Man up, Nut head', 3 
     ) Z 
     ON Z.Author = target.Author 
      And Z.Title = target.Title 
WHEN MATCHED THEN 
    UPDATE SET target.Popularity = Z.Popularity 
WHEN NOT MATCHED THEN 
    Insert(Author, Title, Popularity) Values(Z.Author, Z.Title, Z.Popularity); 

Oracle's MERGE statement

+0

Assez cool. Merci. Juste pour le savoir, y a-t-il quelque chose de similaire sur d'autres plateformes SQL? @sameera a mentionné "SUR DUPLICATE KEY UPDATE" qui est aussi un peu cool. Plus précisément, y a-t-il quelque chose pour sqlite? –

+0

@Cyborgo - Oui. SQL Server 2008 prend en charge à peu près la même syntaxe MERGE. – Thomas

+0

@Cyborgo - AFAIK, SQLIte ne supporte pas MERGE. – Thomas

0

Si je vous comprends bien, quelque chose comme cela devrait fonctionner:

update books set popularity=? where author=? and title=? 

... où ? est un espace réservé.

Editer: Selon votre commentaire, vous souhaitez le créer s'il n'existe pas et le mettre à jour s'il le fait. Je ne pense pas que vous puissiez le faire avec une déclaration, mais je peux me tromper. Dans deux déclarations, vous pouvez l'utiliser pour vérifier si elle existe déjà:

select count(*) from books where author=? and title=? limit 1 

Ce serait la sortie 1 si elle existe ou 0 si elle ne fonctionne pas. De là, vous pouvez choisir d'insérer ou de mettre à jour.

1

Depuis que j'ai posté un commentaire, je posterai aussi une réponse. @icktoofay a affiché une solution, mais en utilisant this link nous pouvons suivre que ce qui se passe réellement à faire un scan de table, essayez donc la place de la solution de Jérémie Clark:

UPDATE Table1 SET (...) WHERE Column1='SomeValue' 
IF @@ROWCOUNT=0 
    INSERT INTO Table1 VALUES (...) 

Notez que cette tente de mettre à jour d'abord, et si elle réussit, @@ROWCOUNT sera 1 ou plus, mais je fais l'hypothèse que vous utiliserez T-SQL (langage SQL de Microsoft). Je ne sais pas que @@ROWCOUNT est pris en charge par d'autres plates-formes.

+0

hey. Je ne pouvais pas écrire le commentaire correctement, donc je l'ai écrit comme une réponse ..pourriez-vous s'il vous plaît regarder dans et laissez-moi savoir si c'est possible ou non. Merci. –

0

Je l'ai utilisé cela dans SQL Anywhere (pas sûr de ce que vous utilisez SGBD, bien)

INSERT INTO "books" ("title", "author", "popularity") ON EXISTING UPDATE VALUES(?,?,?); 

Donc, si l'enregistrement existe, il met à jour simplement. Sinon, créez un nouvel enregistrement.

+0

Je pense que nous avons besoin de connaître sa plate-forme aussi ... Je vais ajouter un autre commentaire sur la question – jcolebrand

+0

Ouais, et je ne suis pas sûr de la tête si le «ON EXISTING UPDATE» est une extension de fournisseur ou non . –