Обновите несколько строк с известными ключами, не вставляя новые строки, если несуществующие ключи найдены - PullRequest
2 голосов
/ 05 апреля 2010

Давайте представим, что у нас есть таблица предметов ...

table: items
item_id INT PRIMARY AUTO_INCREMENT
title VARCHAR(255)
views INT

Давайте представим, что оно заполнено чем-то вроде

(1, item-1, 10),
(2, item-2, 10),
(3, item-3, 15)

Я хочу сделать мульти обновление представления для этих элементов из данных, взятых из этого массива [item_id] => [views]

'1' => '50',
'2' => '60',
'3' => '70',
'5' => '10'

Внимание! Обратите внимание, что у нас item_id = 5 в массиве, но у нас нет item_id = 5 в базе данных.

Я могу использовать INSERT ... ON DUPLICATE KEY UPDATE , но таким образом image_id = 5 будет вставлен в элементы talbe. Как избежать вставки нового ключа? Я просто хочу, чтобы item_id = 5 был пропущен, потому что его нет в таблице.

Конечно, перед выполнением я могу выбрать существующие ключи из таблицы предметов; затем сравните с ключами в массиве; удалите несуществующие ключи и выполните INSERT ... ON DUPLICATE KEY UPDATE . Но, может быть, есть более элегантные решения?

Спасибо.

1 Ответ

5 голосов
/ 06 апреля 2010

Вы можете попытаться сгенерировать таблицу литералов и обновить элементы, присоединившись к таблице:

UPDATE items
    JOIN (SELECT 1 as item_id, 50 as views
          UNION ALL
          SELECT 2 as item_id, 60 as views
          UNION ALL
          SELECT 3 as item_id, 70 as views
          UNION ALL
          SELECT 5 as item_id, 10 as views
          ) as updates
         USING(item_id)
 SET items.views = updates.views;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...