2016-04-29 4 views
3

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

Я также хотел сохранить строку, которая должна быть удалена в другую таблицу (пример таблицы B), прежде чем удалить ее, а затем вставить новую (в таблицу A).

Есть ли другие способы сделать это?

PS: Они будут иметь тот же ключ

+1

Ну простой ответ будет написать запрос, чтобы прочитать строку, а затем записать его в другую таблицу, затем удалить строку, а затем вставить строку с новыми данными – RiggsFolly

+1

Или, если они имеют один и тот же ключ, почему вы удаляете/вставляете, а не обновляете? – BenM

+0

Если у них один и тот же ключ, почему бы просто не обновить строку? –

ответ

0

Вы можете использовать UPDATE ...

UPDATE tbl 
SET col1 = newCol1, 
    col2 = newCol2 
WHERE etc = etc 

И если вы хотите вставить обновленную строку в другую таблицу, вы можете использовать TRIGGER AFTER UPDATE для этого.

CREATE TRIGGER TriggerName ON Tbl 
AFTER UPDATE 
AS 
INSERT INTO Log (Col1, Col2) 
SELECT Col1, Col2 
FROM deleted 
+0

Что делать, если строка не существует? С этим решением я могу сделать это только тогда, когда его уже в моей таблице –

+0

@AhmetKazaman В этом случае вы можете использовать 'if exists (select ...) begin/* query для обновления */end else begin/* query для вставки */end' –

+0

Вы имеете в виду вот это? "DELIMITER // IF EXISTS (SELECT ... WHERE ID = ...) НАЧАТЬ UPDATE ...; END // ELSE НАЧАТЬ INSERT ... END // DELIMITER;" Потому что это не работает для меня: «У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с« BEGIN ». Что я делаю неправильно? И это повлияет на выбор моего запроса? –