Вариант 2 не будет самым эффективным. База данных уже будет выполнять эту проверку для вас, когда вы будете выполнять фактическую вставку или обновление для обеспечения применения первичного ключа. Выполнив эту проверку самостоятельно, вы дважды понесете издержки при поиске в таблице, а также получите дополнительную информацию из вашего Java-кода. Выберите, какой случай является наиболее вероятным, и используйте оптимистичный код.
Расширяя опцию 1, вы можете использовать хранимую процедуру для обработки вставки / обновления. В этом примере с синтаксисом PostgreSQL предполагается, что вставка является нормальным случаем.
CREATE FUNCTION insert_or_update(_id INTEGER, _col1 INTEGER) RETURNS void
AS $$
BEGIN
INSERT INTO
my_table (id, col1)
SELECT
_id, _col1;
EXCEPTION WHEN unique_violation THEN
UPDATE
my_table
SET
col1 = _col1
WHERE
id = _id;
END;
END;
$$
LANGUAGE plpgsql;
Вы также можете сделать обновление нормальным случаем, а затем проверить количество строк, затронутых оператором обновления, чтобы определить, является ли строка действительно новой, и вам нужно выполнить вставку.
Как упоминалось в некоторых других ответах, наиболее эффективный способ выполнить эту операцию - один пакет:
- Возьмите все строки, переданные веб-службе, и массово вставьте их во временную таблицу
- Обновление строк в основной таблице из временной таблицы
- Вставка новых строк в основную таблицу из временной таблицы
- Утилизировать временную таблицу
Тип используемой временной таблицы и наиболее эффективный способ управления ею будет зависеть от используемой вами базы данных.