Sunday, November 18, 2007

Two approaches to update database row if exists, insert if not

.NET Tip of The Day: Two approaches to update database row if exists, insert if not

Two approaches to update database row if exists, insert if not

The biggest challenge with update/insert (so called upsert) is to minimize any kind of locks. Unfortunately there is no silver bullet for this yet. So let's review two the most commonly used methods:

1. Update, if @@ROWCOUNT = 0 then insert

UPDATE Table1 SET Column1 = @newValue WHERE Id = @id

IF @@ROWCOUNT = 0

BEGIN

INSERT INTO Table1 (Id, Column1) VALUES (@id, @newValue)

END

This method is good if you know that in most of the cases a row will exist and update will be performed. Otherwise the second method should be used.

2. If row exists update, otherwise insert

IF EXISTS(SELECT * FROM Table1 WHERE Id = @id)

BEGIN

UPDATE Table1 SET Column1 = @newValue WHERE Id = @id

END

ELSE

BEGIN

INSERT INTO Table1 (Id, Column1) VALUES (@id, @newValue)

END

This one is good if you know that in most of the cases a row will not exist and insert will be performed. For such cases it executes SELECT statement followed by INSERT statement. That results in less expensive lock comparing to UPDATE + INSERT in previous method.