Если предположить уникальный индекс для Column1 , вы можете использовать выражение DCount
, чтобы определить, есть ли у вас ноль или одна строка с Column1 = 'SomeValue' . Затем INSERT
или UPDATE
на основе этого количества.
If DCount("*", "Table1", "Column1 = 'SomeValue'") = 0 Then
Debug.Print "do INSERT"
Else
Debug.Print "do UPDATE"
End If
Я предпочитаю этот подход, чтобы сначала попытаться INSERT
, перехватить ошибку нарушения ключа 3022 и выполнить UPDATE
в ответ на ошибку. Однако я не могу требовать огромных выгод от моего подхода. Если ваша таблица содержит поле автонумерации, исключение неудачного INSERT
не позволит вам излишне увеличивать следующее значение автонумерации. Я также могу избежать построения строки INSERT
, когда она не нужна. Access Cookbook сказал мне, что конкатенация строк - это умеренно дорогая операция в VBA, поэтому я ищу возможности избежать создания строк, если они действительно не нужны. Этот подход также позволит избежать создания блокировки для ненужных INSERT
.
Однако ни одна из этих причин не может быть очень убедительной для вас. И, честно говоря, я думаю, что мое предпочтение в этом случае может заключаться в том, что мне кажется правильным. Я согласен с этим комментарием @ David-W-Fenton к предыдущему вопросу переполнения стека : "Лучше написать свой SQL, чтобы не пытаться добавлять значения которые уже существуют, то есть не допускают возникновения ошибки в первую очередь, а не зависят от механизма базы данных, который спасет вас от вас. "