Вставить в таблицу MySQL или обновить, если существует

696

Я хочу добавить строку в таблицу базы данных, но если строка существует с тем же уникальным ключом, я хочу обновить строку.

Например,

insert into table (id, name, age) values(1, "A", 19)

Предположим, что уникальный ключ id, а в моей базе данных есть строка с id = 1. В этом случае я хочу обновить эту строку этими значениями. Обычно это дает ошибку. Если я использую insert IGNORE, он проигнорирует ошибку, но он все равно не будет обновляться.

  • 3
    Для этого варианта использования SQL требуется официальный синтаксис, который не вызывает дублирования значений в синтаксисе и сохраняет первичный ключ.
Теги:
insert-update

10 ответов

1441
Лучший ответ

Используйте INSERT ... ON DUPLICATE KEY UPDATE

QUERY

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19
  • 83
    +1 Из того, что я обнаружил, этот метод менее проблематичен для ключей автоинкремента и других уникальных коллизий ключей, чем REPLACE INTO, и он более эффективен.
  • 2
    Отличный ответ и ссылка. Этот метод является наилучшим, поскольку он проверяет PRIMARY ключи, UNIQUE индексы и столбцы с автоинкрементом. Таким образом, значения INSERT INTO table (a,b,c) VALUES (NULL, "A", 19) будут по-прежнему вызывать событие обновления.
Показать ещё 21 комментарий
198

Проверьте REPLACE

http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE into table (id, name, age) values(1, "A", 19)
  • 9
    @Piontek Потому что этот короче и его легче понять, и никто не объяснил, почему лучше «вставить на дубликат».
  • 64
    он изменяет идентификаторы записи и, таким образом, может уничтожать внешние ссылки.
Показать ещё 5 комментариев
31

При использовании пакетной вставки используйте следующий синтаксис:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...
25

Попробуйте следующее:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

Надеюсь, что это поможет.

  • 6
    на самом деле мне не нужно добавлять новые значения в другую строку с новым идентификатором, вместо этого я хочу заменить существующие значения id = 1 на эти значения. (насколько я понимаю, это увеличивает идентификатор и добавляет данные)
  • 45
    Я не думаю, что он хочет увеличить идентификатор на дубликаты.
Показать ещё 4 комментария
18

Попробуйте следующее:

INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'

Примечание:
Здесь, если id является первичным ключом, то после первой вставки с id='1' каждый раз при попытке вставить id='1' будет обновляться имя и возраст, а возраст возраста будет меняться.

  • 0
    Я хочу работать без использования идентификатора . Вы пробовали без первичного ключа?
  • 0
    @ersks смотри вопрос. Пользователь спросил о том, когда есть уникальный ключ
Показать ещё 1 комментарий
9

При использовании SQLite:

REPLACE into table (id, name, age) values(1, "A", 19)

При условии, что id является первичным ключом. Или же он просто вставляет другой ряд. Смотрите INSERT (SQLite).

  • 0
    То, что replace into делает, это точно «вставить в, или обновить, когда существует». @Сова
  • 0
    +1 (1 из 3) Я обнаружил, что это работает для моей ситуации - мне нужно было заменить существующую строку уникальным ключом или, если ее нет, добавить строку. Самые простые решения здесь.
Показать ещё 3 комментария
8
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);

INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE SET NAME = "A", AGE = 19;

REPLACE INTO table (id, name, age) VALUES(1, "A", 19);

Все эти решения будут работать в отношении вашего вопроса.

Если вы хотите узнать подробнее об этом утверждении, перейдите по этой ссылке

  • 0
    REPLACE не документирована в связанном документе.
  • 0
    SQL-запросы полны опечаток, ваши примеры не будут работать. Это INSERT INTO TABLE (не INTO TABLE) и ON DUPLICATE KEY UPDATE (не ON DUPLICATE UPDATE SET). Не уверен, кто это голосует
Показать ещё 1 комментарий
6

Просто потому, что я искал это решение, но для обновления из другой таблицы с одинаковой структурой (в моем случае тестовая база данных для базы данных DB):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

Как уже упоминалось в другом месте, после ON DUPLICATE KEY UPDATE следует включить только те столбцы, которые вы хотите обновить.

Не нужно перечислять столбцы в INSERT или SELECT, хотя я согласен, что это, вероятно, лучше.

0

В моем случае я создал следующие запросы, но в первом запросе, если id 1 уже существует и возраст уже существует, после этого, если вы создадите первый запрос без age значение age будет равно ни одному.

REPLACE into table SET 'id' = 1, 'name' = 'A', 'age' = 19

чтобы избежать вышеуказанной проблемы, создайте запрос, как показано ниже

INSERT INTO table SET 'id' = '1', 'name' = 'A', 'age' = 19 ON DUPLICATE KEY UPDATE 'id' = "1", 'name' = "A",'age' = 19

может это поможет тебе...

-5
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

Также не забывайте относиться к уникальному ограничению ключа.

ALTER TABLE `table` ADD UNIQUE `unique_key` ( `id` ) 
  • 0
    Это даже работает !? Вы проверяли это?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню