Вставить в таблицу MySQL или обновить, если существует - PullRequest
779 голосов
/ 17 ноября 2010

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

Например,

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

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

Ответы [ 10 ]

1454 голосов
/ 17 ноября 2010

Использование INSERT ... ON DUPLICATE KEY UPDATE

ЗАПРОС:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19
222 голосов
/ 17 ноября 2010

Проверить ЗАМЕНА

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

REPLACE into table (id, name, age) values(1, "A", 19)
36 голосов
/ 27 января 2017

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

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...
23 голосов
/ 17 ноября 2010

Попробуйте:

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

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

18 голосов
/ 27 августа 2014

Попробуйте это:

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

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

12 голосов
/ 08 декабря 2017
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 NAME = "A", AGE = 19;

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

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

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

9 голосов
/ 17 ноября 2016

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

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

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

7 голосов
/ 09 июня 2017

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

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, хотя я согласен, что это, вероятно, лучшая практика.

1 голос
/ 05 февраля 2019

В моем случае я создал следующие запросы, но в первом запросе, если 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

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

0 голосов
/ 12 декабря 2014
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` ) 
...