Некоторые СУБД имеют расширение для этого, но почему бы вам просто не предоставить функцию, которая сделает это за вас? Мы на самом деле сделали это раньше.
Я не уверен, какой язык вы используете, но у него, вероятно, есть ассоциативные массивы, где вы можете написать что-то вроде:
pk{"ID"} = "27"
val{"Name"} = "'John Brown'"
val{"ItemID"} = "102"
upsert ("MyTable", pk, val)
и, если у него нет ассоциативных массивов, вы можете эмулировать их с несколькими целочисленными массивами строк.
В нашей функции upsert()
мы просто сконструировали строку (update
, затем insert
, если update
не удалось) и передали ее нашей СУБД. Мы держали первичные ключи отдельно от других наших полей, поскольку это значительно упростило построение оператора обновления (столбцы первичного ключа были добавлены в предложение where, другие столбцы были просто установлены).
Результатом вышеуказанных вызовов будет следующий SQL (у нас была другая проверка на сбой update
, но я поместил ваш @@rowcount
в этом примере):
update MyTable set
Name = 'John Brown',
ItemID = 102
where ID = 27
if @@rowcount=0
insert into MyTable (ID, Name, ItemID) values (
27,
'John Brown',
102
)
Это одно решение, которое хорошо сработало для нас. Без сомнения, есть и другие.