Вставка записи в таблицу MySQL или обновление, если запись существует
Я хочу добавить строку в таблицу базы данных, но если строка с тем же уникальным ключом уже существует, я хочу обновить эту строку.
Например:
INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);
Допустим, уникальным ключом является ID
, и в моей базе данных уже есть строка с ID = 1
. В этом случае я хочу обновить эту строку новыми значениями. Обычно это вызывает ошибку.
Если использовать INSERT IGNORE
, то ошибка будет проигнорирована, но строка все равно не обновится.
Как мне реализовать такую функциональность в SQL?
5 ответ(ов)
Когда вы используете пакетную вставку (batch insert), применяйте следующий синтаксис:
INSERT INTO TABLE (id, name, age) VALUES (1, 'A', 19), (2, 'B', 17), (3, 'C', 22)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
...
В этом примере происходит попытка вставить несколько записей одновременно. Если возникает конфликт по уникальному ключу (например, при вставке записи с уже существующим id
), то выполняется обновление полей, указанных после ON DUPLICATE KEY UPDATE
. В данном случае обновляется поле 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 name = "A", age = 19;
или
REPLACE INTO table (id, name, age) VALUES(1, "A", 19);
Каждый из этих вариантов имеет свои особенности при работе с дублирующимися ключами.
Попробуйте использовать следующий запрос:
INSERT INTO table (id, name, age) VALUES ('1', 'Mohammad', '21') ON DUPLICATE KEY UPDATE name = 'Mohammad', age = '21'
Обратите внимание:
Если id
является первичным ключом, то после первого добавления записи с id='1'
при каждой последующей попытке вставки с id='1'
будет производиться обновление значений name
и age
, в результате чего предыдущие значения name
и age
изменятся.
Попробуйте следующий запрос:
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
Надеюсь, это поможет!
Если вы хотите использовать непервичные
поля в качестве критериев/условий для ON DUPLICATE
, вам необходимо создать УНИКАЛЬНЫЙ ИНДЕКС
на этой таблице, чтобы сработало 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);
Не забудьте учитывать, что уникальные индексы могут повлиять на производительность запросов на вставку и обновление, поэтому стоит внимательно анализировать структуру данных.
В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN?
Как сбросить AUTO_INCREMENT в MySQL
INNER JOIN ON vs WHERE: что выбрать?
Присоединение против подзапроса: что выбрать?
Как выбрать строки с MAX(значение колонки), используя PARTITION по другой колонке в MySQL?