MySQL ON DUPLICATE KEY UPDATE для вставки нескольких строк в одном запросе

200

У меня есть запрос SQL, где я хочу вставить несколько строк в одном запросе. поэтому я использовал что-то вроде:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

Проблема в том, что когда я выполняю этот запрос, я хочу проверить, должен ли проверяться UNIQUEключ (который не является PRIMARY KEY), например, 'name'выше, и если такой 'name'уже существует, соответствующая целая строка должна быть обновлена, вставлена ​​в противном случае.

Например, в приведенном ниже примере, если 'Katrina'он уже присутствует в базе данных, должна быть обновлена ​​вся строка, независимо от количества полей. Опять же, если 'Samia'нет, строка должна быть вставлена.

Я думал об использовании:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

Вот ловушка. Я застрял и запутался в том, как поступить. У меня есть несколько строк для вставки / обновления одновременно. Пожалуйста, дайте мне направление. Спасибо.

Prashant
источник

Ответы:

480

Используйте ключевое слово VALUESдля ссылки на новые значения (см. Документацию ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...
Питер Лэнг
источник
2
Что если нам нужно включить оператор IF в UPDATE, который имеет разные условия для каждой строки?
логика
2
@logic: Есть несколько вопросов, связанных с этим: поиск StackOverflow . Если ни один из них не ответит на ваш вопрос, пожалуйста, опубликуйте новый, объясняющий, что именно вам нужно.
Питер Лэнг
@logic вы нашли решение для вашей проблемы? В настоящее время я сталкиваюсь с той же проблемой
Parth kharecha
Отличное предложение. Если вы хотите увеличить значение при дублировании, добавьте его после части «ON DUPLICATE KEY UPDATE»: всего = всего + ЗНАЧЕНИЙ (всего)
Феникс
1

INSERT INTO ... ON DUPLICATE KEY UPDATE будет работать только для MYSQL, но не для SQL Server.

для SQL-сервера способ обойти это - сначала объявить временную таблицу, вставить значение в эту временную таблицу, а затем использовать MERGE

Как это:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);
Ли Рэйчел
источник
15
Кто использует SQL сервер, хотя: D
Джереми Белоло
-3

Вы можете использовать Replace вместо INSERT ... ON DUPLICATE KEY UPDATE.

a1ex07
источник
28
Да, но с помощью REPLACE старая строка удаляется перед вставкой новой строки. Я хочу сохранить старый ряд для поддержки первичных идентификаторов.
Прашант
2
Я не осознавал, что сохранение старого ПК как-то важно для вас ... Конечно, REPLACE в этом случае не сработает ...
a1ex07
4
PS: «заменить в» требует как удалить, так и вставить права!
Оливер М Греч
2
и по вышеупомянутым причинам удаления / вставки, это также намного медленнее в этих случаях.
Росс
1
Что делать, если вы хотите обновить несколько столбцов? Заменить обновит все.
августа