Как правильно вставить / обновить несколько строк в MySQL? Я делаю это правильно? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть база данных, которая выглядит примерно так:

id | product_id | tag
------------------------
1  | 10000      | tag1
------------------------
2  | 10000      | tag2 
------------------------
3  | 10000      | tag3
------------------------
4  | 10001      | tag2 
------------------------
5  | 10002      | tag1
------------------------
6  | 10002      | tag2 

Каждый день мы проверяем веб-сервис на наличие обновленного списка тегов, а затем обновляем базу данных. База данных содержит 50 000 товаров, поэтому мы проверяем только около 100 товаров одновременно.

В настоящее время, когда я проверяю каждый товар (например, product_id 10000), я просто удаляю все строки (DELETE FROM table WHERE product_id= 10000), а затем вставьте все теги, один за другим.

Мне интересно, есть ли для меня лучший способ сделать это (я думаю о чем-то похожем на "INSERT INTO ..."ON DUPLICATE KEY UPDATE ... "Я использую, когда это одна строка, которую я вставляю / обновляю. Сначала я хотел просто вставить их, но если я это сделаю, база данных не будет знать, был ли удален тег)

То, что я делаю сейчас, работает отлично, но такого рода вещи появляются постоянно, и кажется, что должен быть лучший способ сделать это, тот, который не имеет столько обращений кбазы данных.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Я не делаю удаление / вставку для тегов, которые не изменились как:

  • Идентификаторы изменятся (иногда это может быть критично)
  • это могут быть триггеры, которые будутисполняться без причины

Конечно, в некоторых случаях удаление / вставка - это совершенно нормально, но это мое общее правило: не изменяйте неизмененные данные.

Так что мой подход в этомрегистр будет:

DELETE FROM
    tags
WHERE
    product_id = 10000
    AND tag NOT IN ('tag1', 'tag2', 'tag3')
;

INSERT (...) VALUES (...), (...), ... ON DUPLICATE KEYS UPDATE ...
0 голосов
/ 24 октября 2019

Если вы используете транзакции для этого, вы можете идти.

Единственная проблема, которую я могу придумать для этой стратегии, - это остановка БД в середине операций, но транзакции решаются. что.

...