Intereting Posts
Как перенаправить на основе Accept-Language с помощью Apache / mod_rewrite Изображения PNG PNG загружаются с помощью mime «image / jpeg» на KCFINDER 3.12 Как поддерживать «AddType x-mapp-php5 .php» на моей машине разработки ошибка парсера: строка не запускается, ожидая «или» в php Intermittent simplexml_load_file (): предупреждение ввода-вывода на локальном сайте Joomla mysqli :: mysqli (): (HY000 / 2002): Не удается подключиться к локальному серверу MySQL через сокет «MySQL» (2) восстановить резервную копию mysqldump php Doctrine DQL, наследование таблицы классов и доступ к полям подкласса Загруженное изображение не отображается после загрузки ajax в хром Дезаминирование .Net-объекта из PHP с помощью COM Является ли XMLReader синтаксическим анализатором SAX, парсером DOM или нет? Измените значение ранее определенной константы Linkedin разделяет URL-адреса / не анализирует открытый граф Код написан в Hack быстрее, чем код, написанный на PHP на HHVM? Laravel Eloquent: лучший способ расчета общей цены

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

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

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

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

Solutions Collecting From Web of "Обновление дублирующего ключа – несколько столбцов"

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

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

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

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

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

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

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

 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. Если он существует, то он будет обновляться, а столбцы modifiedon, modifiedbym, cname будут обновлены.

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

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