Подтвердить что ты не робот

Обновление дублирующего ключа - несколько столбцов

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

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’)")

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

4b9b3361

Ответ 1

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

Я установил ваши кавычки и отметки.

Edit:

В 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 и т.д.), Вы можете удалить эти кавычки. Backticks необязательны для имен столбцов, если вы не используете имена столбцов, такие как count, type или table.

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

Ответ 2

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

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) [,...]

Ответ 3

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

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']

Ответ 4

Для четкого синтаксиса есть другая синтаксическая форма:

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, createdon, createdby, cname. Если он существует, то он будет обновлен, а столбцы изменены, изменены bym, 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, чего здесь не будет.