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

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

Например,

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

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

13 ответов

Решение

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

QUERY:

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

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

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

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

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

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...
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);

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

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

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

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

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

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

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

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

Если вы хотите сделать non-primary поля как критерии / условие для ON DUPLICATE, вы можете сделать UNIQUE INDEX ключ в этой таблице, чтобы вызвать DUPLICATE.

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);

И если вы хотите объединить два поля, чтобы сделать его уникальным в таблице, вы можете добиться этого, добавив больше в последний параметр.

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);

Обратите внимание: сначала обязательно удалите все данные с одинаковыми name а также age значение в других строках.

DELETE table FROM table AS a, table AS b WHERE a.id < b.id 
AND a.name <=> b.name AND a.age <=> b.age;

После этого должен сработать ON DUPLICATE событие.

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

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

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

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

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

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

В случае, если вы хотите сохранить старое поле (например: имя). Запрос будет таким:

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

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

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

Ниже приведены некоторые из возможных подходов:

С использованием

The оператор позволяет вставить одну или несколько строк в таблицу

  • Сначала укажите имя таблицы и список столбцов, разделенных запятыми, в круглых скобках после предложения.
  • Во-вторых, поместите через запятую список значений соответствующих столбцов в круглые скобки послеVALUESключевое слово.
      INSERT INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");

С использованиемINSERT INTOсWHERE NOT EXISTSпункт

      INSERT INTO table_name (column_name_1, column_name_2, column_name_3)
SELECT * FROM (SELECT "col_value_1", "col_value_2","col_value_3") AS tmp_name
WHERE NOT EXISTS (
    SELECT column_name2 FROM table_name WHERE column_name = "sample_name"
) LIMIT 1;

С использованиемREPLACE INTO

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

      REPLACE INTO table_name(column_name1, column_name2, column_name3) VALUES("col_value_1", "col_value_2", "col_value_3");
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` ) 
Другие вопросы по тегам