У меня есть таблица со столбцами record_id
(автоматический 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 , например:
INSERT INTO table (key,col1) VALUES (1,2)
ON DUPLICATE KEY UPDATE col1 = 2;
Если у вас есть твердые ограничения в таблице, вы также можете использовать REPLACE INTO
для который. Вот цитата из MySQL:
REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед новой строкой. вставлен.
Синтаксис в основном такой же, как INSERT INTO
,
Как уже упоминалось, вы должны использовать «вставить ... при дублировании обновления ключа», иногда называемое «upsert». Однако в вашем конкретном случае вы не хотите использовать статическое значение в обновлении, а скорее значения, которые вы передаете в предложение values оператора вставки.
В частности, я думаю, вы хотите обновить два столбца, если строка уже существует:
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
Другое options делает select, чтобы выяснить, существует ли запись, а затем соответственно вставлять / обновлять. Помните, что если вы используете транзакцию, select не будет явно прекращать транзакцию, поэтому ее можно безопасно использовать.