Обновить таблицу сопоставления тегов в MySQL - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть таблица сопоставления тегов MySQL со структурой из следующего поста - Рекомендуемый дизайн базы данных SQL для тегов или тегов

У меня есть два столбца - TagID и ItemID.Я хочу сделать обновление для некоторого элемента (изменить его теги).Например, у меня был элемент с ID = 1 с tagID 1,2,3.Но при обновлении пользователю нужны только теги с ID 3,4,5.Очевидно, мне нужно удалить «1» и «2», оставить «3» и добавить «4» и «5».

Какой самый простой / самый элегантный способ сделать это (использовать INSERT INGORE'S,ON DUPLICATE UPDATE или некоторые другие «функции» MySQL)?

Удалить все и вставить все «новые» теги обратно или пройти их все и удалить / вставить отдельно?Это будет минимум 1, максимум 5 тегов.Или это действительно не имеет значения для такого небольшого количества тегов / операций?

1 Ответ

6 голосов
/ 22 февраля 2012

Если у вас определенно есть максимум пять тегов, включая их в таблицу как tag1, tag2, tag3, tag4, tag5, безусловно, будут «простейшими». Для большей простоты вы можете просто обновить все 5 значений, поэтому теги 3, 4, 5 сохраняются в tag1, tag2, tag3, а tag4 и tag5 сохраняются как NULL. Очевидно, что он не масштабируется - вы определенно не захотите делать это с большим количеством (или потенциально неограниченным) тегов.

Следующим самым простым будет удалить все и заново вставить, но это не особенно элегантно.

Самый элегантный способ, который я могу придумать, - запустить два запроса. Первый удалит все, что не является вашим новым набором тегов. Я расширил ваш пример, добавив два замещающих тега: (3,4,5,6,7). Далее будут вставлены все ваши новые теги, но будут игнорироваться дубликаты, основанные на УНИКАЛЬНОМ комбинированном индексе TagID и ItemID.

#This creates the table and UNIQUE index, so you can understand how the next queries work
CREATE TABLE `taglinks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ItemID` int(11) NOT NULL,
  `TagID` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `Linkindex` (`ItemID`,`TagID`)
);

#This inserts example data
INSERT INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5);

#This removes tags 1 and 2
DELETE FROM `taglinks` WHERE `ItemID` = 1 AND `TagID` NOT IN (3,4,5,6,7);

#This adds two new tags (6 and 7). Tags 3, 4 and 5 are unaffected
INSERT IGNORE INTO `taglinks` (`ItemID`, `TagID`) VALUES (1,6),(1,7),(1,3),(1,4),(1,5);
...