Каков правильный / самый быстрый способ обновить / вставить запись в sql (Firebird / MySql)

Мне нужен SQL для обновления записи в базе данных, если она существует, и вставки ее, если ее нет. Похоже, есть несколько решений для этого, но я не знаю, каковы правильные / принятые способы сделать это.

В идеале я бы хотел, чтобы он работал как с Firebird 2, так и с MySQL 5, поскольку обновление нужно будет запускать для обеих баз данных, и было бы проще, если бы один и тот же SQL работал на обеих, если бы он работал с большим количеством баз данных, что было бы плюсом .

Скорость и надежность также имеют значение, надежность важнее скорости в этом случае, но он потенциально будет использоваться для обновления тысяч записей в быстрой последовательности (по разным таблицам).

какие-либо подчинения?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
5
0
5 344
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Для MySQL попробуйте команду REPLACE: http://dev.mysql.com/doc/refman/5.0/en/replace.html

(См. Комментарий Милана Бабускова к этому ответу для эквивалентов на Firebird.)

Firebird 2.1 поддерживает стандартную команду MERGE SQL, а также конструкцию INSERT OR UPDATE.

Milan Babuškov 08.12.2008 21:49

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;

Другие вопросы по теме