更新不正确的外键?
问题描述:
我有一些需要清理的损坏数据。考虑到数据的当前状态,我怎么能做到这一点?更新不正确的外键?
共享表包含引用房间表的外键。目前房间表中有重复。应该是许多股票指向一个房间的情况。但是,情况是每个股票的房间表中都有一个条目。房间条目是相同的,我希望删除冗余条目。很显然,首先要做的是纠正Share表中的引用。
冗余房项目: 通讯分享条目:
如何让所有的Share.room_id的角度,从房间表相同的进入?我尝试过各种Update语句,但没有成功。以下Update语句没有意义,因为我指定了Room条目,这当然不起作用。但我必须以某种方式关闭Room桌上的连接。
UPDATE share s
SET room_id = (SELECT DISTINCT MIN(s.room_id) FROM room r
WHERE s.room_id = r.id
GROUP BY ROLLUP(r.addition_id, r.area, r.first_effective_at))
任何建议将不胜感激。先谢谢你。
只是想后,对我工作的更新语句:
UPDATE share s
SET room_id = (SELECT MIN(r.id) FROM room r
JOIN room r2
ON (r.addition_id = r2.addition_id
AND r.area = r2.area
AND r.first_effective_at = r2.first_effective_at
AND r.permanent_id = r2.permanent_id)
WHERE r2.id = s.room_id
GROUP BY r.addition_id, r.area, r.first_effective_at, r.permanent_id);
这是超级慢,可能是非常低效的,但它只需要运行一次。
答
也许是这样的,未经检验:
update share s
set room_id =
(select min(r.id)
from room r
join
(select addition_id, area, first_effective_at
from room
where s.room_id = id)
as r2
on r.addition_id = r2.addition_id and r.area = r2.area and r.first_effective_at = r2.first_effective_at
group by r.addition_id, r.area, r.first_effective_at);
+0
谢谢。我能够使这个查询的变体工作。 – Ken 2013-03-15 18:01:58
那么,什么是在房间的唯一关键?显然它不是ID - 这显然只是一个(无用的)合成主键。那么,我们如何才能知道ROOMS中的哪些行是duff和哪些是犹太洁食? – APC 2013-03-15 15:22:12
嗡嗡声。我的道歉,我不认为我的回应会回答你的问题。 Room中的外键Addition_Id指向Building_Addition表中的条目。 Building_Addition表具有对建筑物表格的引用。但是,我并不关心使用哪个匹配的房间条目。 – Ken 2013-03-15 16:05:10
我确实忽略了我发布的示例数据中的列。房间表中有一个permanent_id列。 – Ken 2013-03-15 16:21:09