Как правильно / самый быстрый способ обновить / вставить запись в SQL (Firebird / MySql) - PullRequest
4 голосов
/ 05 декабря 2008

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

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

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

Есть ли какие-либо вопросы?

Ответы [ 6 ]

6 голосов
/ 05 декабря 2008

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

3 голосов
/ 05 декабря 2008

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

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 INTO the_table (pk, data) VALUES ('whatever', 'stuff')

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
1 голос
/ 25 июля 2009

В 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;
1 голос
/ 05 декабря 2008

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

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

0 голосов
/ 05 декабря 2008

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

0 голосов
/ 05 декабря 2008

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

Синтаксис:

ЗАМЕНИТЬ [LOW_PRIORITY | ЗАДЕРЖИВАЕТСЯ] [INTO] tbl_name [(col_name, ...)]

{ VALUES | VALUE} 

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

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

...