MySQL ON DUPLICATE KEY UPDATE для вставки нескольких строк в одном запросе - PullRequest
178 голосов
/ 26 апреля 2010

У меня есть 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

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

Ответы [ 3 ]

422 голосов
/ 26 апреля 2010

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

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = <b>VALUES</b>(age),
     ...
1 голос
/ 18 мая 2018

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);
0 голосов
/ 26 апреля 2010

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

...