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

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

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

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

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


person Re0sless    schedule 05.12.2008    source источник


Ответы (6)


Вы должны либо использовать что-то вроде этого:

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'
person Smokey Bacon Esq.    schedule 05.12.2008

В Firebird 2.1 вы можете использовать UPDATE OR INSERT для простых случаев. или MERGE для более сложных сценариев.

person Douglas Tosi    schedule 05.12.2008

В 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;
person Marco    schedule 24.07.2009

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

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

person xahtep    schedule 05.12.2008
comment
Firebird 2.1 поддерживает стандартную команду MERGE SQL, а также конструкцию INSERT OR UPDATE. - person Milan Babuškov; 08.12.2008

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки.

Синтаксис:

ЗАМЕНИТЬ [LOW_PRIORITY | ЗАДЕРЖАНО] [INTO] имя_таблицы [(имя_столбца, ...)]

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),...

Принимая во внимание: При работе с ограничениями лучше избегать REPLACE.

person Samiksha    schedule 05.12.2008

Я использовал INSERT в MySQL, чтобы обновить строки с помощью:
INSERT INTO table () VALUES () ON DUPLICATE KEY UPDATE key
Но вы не можете использовать автоматически сгенерированный ключ.

person charlesbridge    schedule 05.12.2008