Обновление Firebird 2.5 или вставка в - PullRequest
0 голосов
/ 26 июня 2018

Я не могу понять, как написать оператор SQL в Firebird, поэтому он должен добавить новую строку, и, если выполняются некоторые условия, обновить также другой столбец.

Пример:

(в MySql выглядит так:)

insert into 
table (col1, col2, col3) values ('a', 'b', 'c')
on duplicate key update col4=col3;

1 Ответ

0 голосов
/ 26 июня 2018

У вас есть два варианта в 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.

...