Мне нужен SQL для обновления записи в базе данных, если она существует, и вставки ее, если ее нет. Похоже, есть несколько решений для этого, но я не знаю, каковы правильные / принятые способы сделать это.
В идеале я бы хотел, чтобы он работал как с Firebird 2, так и с MySQL 5, поскольку обновление нужно будет запускать для обеих баз данных, и было бы проще, если бы один и тот же SQL работал на обеих, если бы он работал с большим количеством баз данных, что было бы плюсом .
Скорость и надежность также имеют значение, надежность важнее скорости в этом случае, но он потенциально будет использоваться для обновления тысяч записей в быстрой последовательности (по разным таблицам).
какие-либо подчинения?


Для MySQL попробуйте команду REPLACE: http://dev.mysql.com/doc/refman/5.0/en/replace.html
(См. Комментарий Милана Бабускова к этому ответу для эквивалентов на Firebird.)
REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки.
Синтаксис:
ЗАМЕНИТЬ [LOW_PRIORITY | С ЗАДЕРЖКОЙ] [INTO] имя_таблицы [(имя_столбца, ...)]
{ VALUES | VALUE}
({expr | DEFAULT},...),(...),...
Тогда как: Лучше избегать REPLACE при работе с ограничениями.
Вы должны либо использовать что-то вроде этого:
BEGIN TRANSACTION
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever')
UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
ELSE
INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
COMMIT
Или это, но отправляйте их отдельно и игнорируйте любые ошибки INSERT о нарушении ограничений первичного ключа:
INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
Я использовал INSERT в MySQL для обновления строк с помощью: INSERT INTO table () VALUES () ON DUPLICATE KEY UPDATE key
Но вы не можете использовать автоматически сгенерированный ключ.
В Firebird 2.1 вы можете использовать ОБНОВЛЕНИЕ ИЛИ ВСТАВИТЬ для простых случаев или ОБЪЕДИНЕНИЕ для более сложных сценариев.
В firebird до 2.1 вы можете использовать этот хитрый способ:
insert into table (id, a, b, c) values (:id, :a, :b, :c)
when SQLCODE -803
do
begin
update table set a = :a, b = :b, c = :c where id = :id;
end;
Firebird 2.1 поддерживает стандартную команду MERGE SQL, а также конструкцию INSERT OR UPDATE.