У вас есть два варианта в Firebird
ОБНОВЛЕНИЕ ИЛИ ВСТАВКА
Вы можете использовать UPDATE OR INSERT
:
UPDATE OR INSERT INTO table (col1, col2, col3)
VALUES ('a', 'b', 'c')
MATCHING (col1, col2)
Условие MATCHING
необязательно. Если вы пропустите его, он будет использовать первичный ключ:
UPDATE OR INSERT вставляет новую запись или обновляет одну или несколько существующих
записей. Предпринимаемые действия зависят от значений, предоставленных для
столбцы в предложении MATCHING (или, если последний отсутствует, в
основной ключ). Если найдены записи, соответствующие этим значениям, они
обновляются. Если нет, вставляется новая запись.
В отличие от кода в вашем вопросе, это не позволит вам настроить обновление: оно будет использовать те же значения, что и при вставке.
Если вы хотите больше контроля, используйте слияние
СЛИЯНИЕ
Оператор MERGE
дает вам больше контроля, но может быть немного более подробным:
MERGE INTO table AS t
USING (select 'a' as new1, 'b' as new2, 'c' as new3 from rdb$database) as s
ON t.col1 = s.new1 and t.col2 = s.new2
WHEN MATCHED THEN
UPDATE SET t.col4 = t.col3
WHEN NOT MATCHED THEN
INSERT (col1, col2, col3) values (s.new1, s.new2, s.new3)
Однако, в отличие от UPDATE OR INSERT
, MERGE
не может использовать первичный ключ. Вам нужно будет указать повторяющиеся правила самостоятельно в предложении ON
.