Можно ли и безопасно объединить синтаксис MySQL для INSERT INTO SET и ON DUPLICATE KEY UPDATE (с тем же набором столбцов)? - PullRequest
0 голосов
/ 28 сентября 2019

Я знаю, как работает определенный синтаксис запросов MySQL для INSERT INTO SET и ON DUPLICATE KEY UPDATE.Но вы можете объединить их?И ... можете ли вы использовать одну и ту же строку $columnSet (см. Ниже) для части INSERT и UPDATE, оставив там уникальное поле?

Конкретизируйте этот пример (я использую php сpdo на моем сервере):

// Define the query
$columnSet = "id=:id, date=:date, created=:created, modified=:modified, removed=:removed, synced=1, points=:points, comment=:comment";
$insertQuery = "INSERT INTO point_events SET"
               . $columnSet." ON DUPLICATE KEY UPDATE ".$columnSet;

   // Define the data
    $pointData['id'] = 'someuniqueid not auto incremented';
$pointData['created'] = 1234; // a timestamp
$pointData['modified'] = 1234; // a timestamp
$pointData['removed'] = NULL;
$pointData['points'] = 10;
$pointData['comment'] = "A comment";
$pointData['date'] = time();

// Execute the query. pdoModify is custom function that executes the query.
pdoModify($pdoNew, $insertQuery, $oldData); 

Все сообщения, которые я видел, не объединяют эти два синтаксиса, и все сообщения на ON DUPLICATE KEY UPDATE предполагают, что вы не должны включать (дублирующий) ключ в строкупосле UPDATE.Итак, это безопасно, или это может вести себя по-другому / иметь нежелательные побочные эффекты.Именно то, что мне нужно, - это оставить уникальный идентификатор в $ columnSet для ОБНОВЛЕНИЯ.

1 Ответ

1 голос
/ 28 сентября 2019

Я считаю, что ваш код должен работать.Как правило, поскольку первоначально проверяется дубликат уникального ключа id, он гарантированно останется неизменным при вызове предложения ON DUPLICATE KEY.

Однако это поведение неоптимально (вы обновляете поля, которыебез изменений) и довольно жестко: что, если вам нужно увеличить amount с вновь введенным значением или объединить новое comment в конце существующего?

Как прокомментировал Rogue , синтаксис MySQL имеет приятную особенность, которая позволяет использовать VALUES(<some column>) в предложении ON DUPLICATE KEY для ссылки на значение, которое было передано для INSERT.Я бы предложил использовать это, поскольку он более элегантен и дает вам гораздо больше контроля и гибкости.

Пример:

$insertQuery = 
    "INSERT INTO point_events SET"
    . $columnSet
    ." ON DUPLICATE KEY UPDATE"
    ." modified =  VALUES(modified)"                  # replace this value
    .", synced = 1"                                  # assign a fixed value
    .", amount = amount + VALUES(amount)"             # add the new value
    .", comment = CONCAT(comment, ', ', VALUES(comment))"    # concatenante the new value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...