11

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

13

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

Например:

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);

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

Как мне реализовать такую функциональность в SQL?

5 ответ(ов)

0

Когда вы используете пакетную вставку (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. Вы можете добавить другие поля для обновления по аналогии.

0

Любое из этих решений подойдет для вашей задачи:

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);

Каждый из этих вариантов имеет свои особенности при работе с дублирующимися ключами.

0

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

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 изменятся.

0

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

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

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

0

Если вы хотите использовать непервичные поля в качестве критериев/условий для 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);

Не забудьте учитывать, что уникальные индексы могут повлиять на производительность запросов на вставку и обновление, поэтому стоит внимательно анализировать структуру данных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь