【发布时间】:2010-09-22 07:10:30
【问题描述】:
下面是我的(简化的)架构(在 MySQL 版本 5.0.51b 中)和我更新它的策略。必须有更好的方法。插入新项目需要 4 次访问数据库,编辑/更新项目最多需要 7!
items:itemId、itemName
类别:catId、catName
地图:mapId*、itemId、catId
* mapId (varchar) 是 itemId + | 的 concat + 猫号
1) 如果插入:插入项目。通过 MySQL API 获取 itemId。
其他更新:只更新项目表。我们已经有了 itemId。
2) 有条件地批量插入categories。
INSERT IGNORE INTO categories (catName)
VALUES ('each'), ('category'), ('name');
3) 从categories 中选择 ID。
SELECT catId FROM categories
WHERE catName = 'each' OR catName = 'category' OR catName = 'name';
4) 有条件地批量插入map。
INSERT IGNORE INTO map (mapId, itemId, catId)
VALUES ('1|1', 1, 1), ('1|2', 1, 2), ('1|3', 1, 3);
如果插入:我们完成了。其他更新:继续。
5) 我们可能不再像更新前那样将类别与此项目相关联。删除此 itemId 的旧类别。
DELETE FROM MAP WHERE itemId = 2
AND catID <> 2 AND catID <> 3 AND catID <> 5;
6) 如果我们将自己与某个类别分离,则可能我们将其孤立了。我们不想要没有项目的类别。因此,如果affected rows > 0,杀死孤立的类别。我还没有找到在 MySQL 中组合这些的方法,所以这是 #6 和 #7。
SELECT categories.catId
FROM categories
LEFT JOIN map USING (catId)
GROUP BY categories.catId
HAVING COUNT(map.catId) < 1;
7) 删除在第 6 步中找到的 ID。
DELETE FROM categories
WHERE catId = 9
AND catId = 10;
请告诉我,我没有看到更好的方法。
【问题讨论】:
-
是否涉及
AUTO_INCREMENT值?有些解决方案会快速“烧毁”它们。