Как ВСТАВИТЬ запись или ОБНОВЛЕНИЕ, если оно уже существует?

У меня есть таблица со столбцами 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", иначе обновляют существующую запись?

32
задан MrWhite 17 January 2014 в 01:01
поделиться

5 ответов

MySQL поддерживает синтаксис insert-on-duplicate , например:

INSERT INTO table (key,col1) VALUES (1,2)
  ON DUPLICATE KEY UPDATE col1 = 2;
48
ответ дан 27 November 2019 в 20:27
поделиться

Если у вас есть твердые ограничения в таблице, вы также можете использовать REPLACE INTO для который. Вот цитата из MySQL:

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

Синтаксис в основном такой же, как INSERT INTO ,

12
ответ дан 27 November 2019 в 20:27
поделиться

Как уже упоминалось, вы должны использовать «вставить ... при дублировании обновления ключа», иногда называемое «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);
3
ответ дан 27 November 2019 в 20:27
поделиться

Ознакомьтесь с «Вставить при обновлении повторяющегося ключа» .

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;
2
ответ дан 27 November 2019 в 20:27
поделиться

Один из вариантов - использование дублирующего синтаксиса обновления

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

Другое options делает select, чтобы выяснить, существует ли запись, а затем соответственно вставлять / обновлять. Помните, что если вы используете транзакцию, select не будет явно прекращать транзакцию, поэтому ее можно безопасно использовать.

1
ответ дан 27 November 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: