Das nervt mich an MSSQL ( schimpfen auf meinem Blog ). Ich wünsche MSSQL unterstützt upsert
.
Der Code von @ Dillie-O ist ein guter Weg in älteren SQL-Versionen (+1 Stimmen), aber es handelt sich im Grunde immer noch um zwei E / A-Operationen (die exists
und dann die update
oder insert
)
Grundsätzlich gibt es einen etwas besseren Weg für diesen Beitrag :
--try an update
update tablename
set field1 = 'new value',
field2 = 'different value',
...
where idfield = 7
--insert if failed
if @@rowcount = 0 and @@error = 0
insert into tablename
( idfield, field1, field2, ... )
values ( 7, 'value one', 'another value', ... )
Dies reduziert es auf eine E / A-Operation, wenn es sich um ein Update handelt, oder auf zwei, wenn es sich um eine Einfügung handelt.
MS Sql2008 führt merge
aus dem SQL: 2003-Standard ein:
merge tablename as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert ( idfield, field1, field2, ... )
values ( 7, source.field1, source.field2, ... )
Jetzt ist es wirklich nur eine E / A-Operation, aber schrecklicher Code :-(
MERGE
unterstützt dieWHERE
Klausel nicht, müssen Sie diese mitUSING
und umschreibenON
. Wenn Sie nicht hinzufügenWITH (HOLDLOCK)
, gibt es auch ein Rennen und es kann gleichzeitig zuINSERT
s kommen, wobei eines davon aufgrund des Schlüsselkonflikts fehlschlägt.Die gesuchte Funktionalität wird traditionell als UPSERT bezeichnet. Wenn Sie zumindest wissen, wie es heißt, können Sie leichter finden, wonach Sie suchen.
Ich glaube nicht, dass SQL Server 2005 großartige Möglichkeiten bietet, dies zu tun. 2008 wird die MERGE-Anweisung eingeführt, mit der dies erreicht werden kann: http://www.databasejournal.com/features/mssql/article.php/3739131 oder http://blogs.conchango.com/davidportas/archive/ 2007/11/14 / SQL-Server-2008-MERGE.aspx
Merge war in der Beta von 2005 verfügbar, wurde jedoch in der endgültigen Version entfernt.
quelle
Was der Upsert / Merge tut, hat etwas mit der Wirkung von ...
Hoffentlich kann die Kombination dieser Artikel und dieses Pseudocodes die Dinge in Bewegung bringen.
quelle
Ich habe einen Blog-Beitrag zu diesem Thema geschrieben.
Wenn Sie günstige Updates wünschen und für die gleichzeitige Verwendung sicher sein möchten, versuchen Sie Folgendes:
Auf diese Weise haben Sie 1 Operation für Aktualisierungen und maximal 3 Operationen für Einfügungen. Wenn Sie also allgemein aktualisieren, ist dies eine sichere, günstige Option.
Ich würde auch sehr vorsichtig sein, nichts zu verwenden, was für die gleichzeitige Verwendung unsicher ist. Es ist wirklich einfach, Primärschlüsselverletzungen oder doppelte Zeilen in der Produktion zu erhalten.
quelle