При обновлении дубликата ключа - несколько столбцов - PullRequest
27 голосов
/ 24 января 2012

При использовании insert ... при обновлении дубликата ключа , каков синтаксис для обновления нескольких столбцов?

INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure

Обновление: я использую это в PHP. Поскольку это вопрос синтаксиса, он очень актуален.

$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4) 
                         VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
                         ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)")

Опять же, не уверен насчет этой последней части с «Обновлением».

Ответы [ 4 ]

33 голосов
/ 24 января 2012
INSERT INTO table1
  (`col1`, `col2`, `col3`, `col4`)
VALUES
  ('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
  `col2`='val2',
  `col3`='val3', [...]

Я исправил ваши кавычки и отметки.

Редактировать:

В PHP:

$result = mysql_query("
     INSERT INTO table1
         (col1, col2, col3, col4)
     VALUES
         ('" . $val1 . "',  '" . $val2 . "', '" . $val3 . "', '" . $val4 . "')
     ON DUPLICATE KEY UPDATE
         col2='" . $val2 . "',
         col3='" . $val3 . "',
         col4='" . $val4 . "'"
 );

Обратите внимание, что значенияв кавычках '.Если значения имеют числовой тип (INT, FLOAT и т. Д.), Вы можете удалить эти кавычки.Обратные метки необязательны для имен столбцов, если вы не используете имена столбцов, такие как count, type или table.

В примере с PHP конкатенация строк используется для четкого выделенияпеременные.

25 голосов
/ 26 февраля 2014

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

INSERT INTO table1
  (col1, col2, col3, col4)
VALUES
  ('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
  col2=VALUES(col2),
  col3=VALUES(col3) [,...]

Который имеет преимущество, он все равно будет работать для оператора множественной вставки:

INSERT INTO table1
  (col1, col2, col3, col4)
VALUES
  ('val1', 'val2', 'val3', 'val4'),
  ('val5', 'val6', 'val7', 'val8'),
  ('val9', 'val10', 'val11', 'val12')
ON DUPLICATE KEY UPDATE
  col2=VALUES(col2),
  col3=VALUES(col3) [,...]
0 голосов
/ 09 ноября 2013

Ради ясного синтаксиса есть еще одна синтаксическая форма;

INSERT INTO `table1` SET `id`=$id,
                         `col2`='$col2',
                         `col3`='$col3'[, ...]
 ON DUPLICATE KEY UPDATE `col2`='$col2',
                         `col4`='$col4'[, ...]

Пример;

INSERT INTO customers SET cid=10,
                          createdon=NOW(),
                          createdby='user',
                          cname='Steve'
  ON DUPLICATE KEY UPDATE modifiedon=NOW(),
                          modifiedby='user',
                          cname='Steve';

Если в базе данных не существует клиента с ID = 10, он будетсоздал и столбцы cid, создал на, создан, cname будет установлен.Если он существует, он будет обновлен, а столбцы, измененные, измененные, cname, будут обновлены.

ПРИМЕЧАНИЕ # 1: Если вы укажете здесь первичный ключ cid = 0, будет запущено AUTO_INCREMENT (конечно,если столбец pk определен как AUTO_INCREMENT) и запись будет вставлена!

ПРИМЕЧАНИЕ # 2: ON DUPLICATE KEY UPDATE выполняет обновление для существующей записи PK ID.Но также это делает обновление, если DUPLICATE сделан на любом столбце UNIQUE KEY.Например, если вы определили, что столбец cname имеет значение UNIQUE, то сохранение записи с уже имеющимся cname = 'Steve' приведет к ОБНОВЛЕНИЮ этой записи (не новой INSERT).Позаботьтесь об этом, потому что вы можете ожидать, что DB вернет ошибку для нарушения ограничения UNIQUE KEY, чего здесь не произойдет.

0 голосов
/ 24 января 2012

Ваш запрос кажется правильным.Вот мой пример запроса такого типа:

INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...