Ответ 1
MySQL поддерживает insert-on-duplicate синтаксис, f.e.:
INSERT INTO table (key,col1) VALUES (1,2)
ON DUPLICATE KEY UPDATE col1 = 2;
У меня есть таблица с столбцами record_id
(auto inc), sender
, sent_time
и status
.
Если нет какой-либо записи конкретного отправителя, например "sender1", я должен ЗАПИСАТЬ новую запись, иначе мне нужно ОБНОВИТЬ существующую запись, принадлежащую "user1".
Итак, если запись уже не сохранена, я бы выполнил
# record_id is AUTO_INCREMENT field
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
В противном случае я бы выполнил инструкцию UPDATE.
В любом случае.. кто-нибудь знает, как объединить эти два оператора, чтобы вставить новую запись, если нет записи, где значение поля отправителя "user1" в противном случае обновляет существующую запись?
MySQL поддерживает insert-on-duplicate синтаксис, f.e.:
INSERT INTO table (key,col1) VALUES (1,2)
ON DUPLICATE KEY UPDATE col1 = 2;
Если у вас есть жесткие ограничения на таблицу, вы также можете использовать REPLACE INTO
. Вот цитата из MySQL:
REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE, старая строка будет удалена до того, как будет вставлена новая строка.
Синтаксис в основном такой же, как INSERT INTO
, просто замените INSERT
на REPLACE
.
INSERT INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
будет тогда
REPLACE INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
Обратите внимание, что это специфичная для MySQL команда, которая не встречается в других БД, поэтому помните о переносимости.
Как уже упоминалось, вы должны использовать "insert... on duplicate key update", иногда называемый "upsert". Однако в вашем конкретном случае вы не хотите использовать статическое значение в обновлении, а скорее значения, которые вы передаете в предложение values инструкции insert.
В частности, я думаю, вы хотите обновить два столбца, если строка уже существует:
1) sent_time
2) status
Чтобы сделать это, вы должны использовать инструкцию upsert (см. пример):
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
ON DUPLICATE KEY UPDATE
sent_time = values(sent_time),
status = values(status);
Отметьте "Вставить в обновление повторяющихся ключей" .
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
Один параметр используется при дублировании синтаксиса обновления
http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
Другие параметры делают выбор, чтобы выяснить, существует ли запись, а затем соответственно включить/обновить. Имейте в виду, что если вы хотите выбрать транзакцию, явным образом не прекращаю транзакцию, поэтому она безопасна при ее использовании.
use merge statement :
merge into T1
using T2
on (T1.ID = T2.ID)
when matched
then update set
T1.Name = T2.Name
when not matched
then insert values (T2.ID,T2.Name);