MySQL 5.6
我们有两个表:cars
和views
。
Cars Views
---+------- ---+-------
id | desc id | car_id
---+------- ---+-------
1 | desc1 1 | 1
2 | Desc1 2 | 2
3 | desc2 3 | 3
问题在于表格汽车中的desc
字段。该行必须是唯一的,但我们不幸地允许用户填写大写的值,这使我们遇到了(根据上面的示例)两个重复的行:desc1
和Desc1
。 / p>
解决问题的方法是DELETE
复制的汽车,并且只保留第一辆汽车。我们知道如何处理。
我们的问题出现在更新相关表之前,其中一些视图与具有重复desc的汽车相关联(例如将要移除的汽车)。应该更新这些视图,以便分配给第一辆重复的汽车(在这种情况下是汽车ID#1)
在UPDATE
之后,我们在观看中喜欢这个结果:
Views
---+-------
id | car_id
1 | 1
2 | 1
3 | 3
我们能够获取重复汽车的所有ID并处理删除但我们仍然坚持使用此UPDATE
。
答案 0 :(得分:0)
解决方案是创建一个映射表,其中包含描述id
的前/后值。
结果应该类似于:
Before | After
---------------
1 | 1
2 | 1
3 | 3
可以使用以下内容创建该表:
SELECT
cars.id AS before_id,
fixed.lowest_id AS after_id
FROM cars
JOIN (
-- The lowest id value for each duplicate description
SELECT
MIN(id) AS lowest_id,
LOWER(desc) AS lower_desc
FROM cars
GROUP BY LOWER(desc)
) fixed
ON LOWER(cars.desc) = fixed.lower_desc
然后,您可以将您的视图与该映射表匹配,以提取新的"更正" id
值。
答案 1 :(得分:0)
UPDATE Views AS v
JOIN (SELECT c1.id AS oldID, MIN(c2.id) AS newID
FROM Cars AS c1
JOIN Cars AS c2 ON LOWER(c1.desc) = LOWER(c2.desc)
HAVING oldID != newID) AS c
ON v.car_id = oldID
SET v.car_id = newID
子查询查找包含重复描述的每个ID的主ID。将其与Views
表联系起来可提供进行替换所需的信息。