更新相对较大的表(约7000万行)的推荐方法是什么,以替换id为不同表的外键列(由当前键间接链接) ?
假设我有三张桌子:
Person
Id long,
Group_id long --> foreign key to Group table
Group
Id long
Device_id long --> foreign key to Device table
Device
Id long
我想更新Person
表以获得Device
表的直接外键,即:
Person
Id long,
Device_Id long --> foreign key to Device table
Device
Id long
查询看起来像这样:
-- replace Group_id with Device_id
update p from Person p
inner join Group g
on g.Id = p.Group_id
set p.Group_id = g.Device_id
我首先删除FK约束,然后重命名该列。
答案 0 :(得分:1)
如果你正确地写了UPDATE(假设这是SQL Server)
,它会工作update p
set p.Group_id = g.Device_id
from Person p
inner join Group g on g.Id = p.Group_id
除此之外,重新使用,然后重命名列*是一个非常聪明的举动。除非您希望使用WHILE循环和person.Id标记将更新分解为批次,否则无法想出任何更快速的方法。
* -
ALTER TABLE DROP COLUMN DOES NOT RECLAIM THE SPACE THE COLUMN TOOK
答案 1 :(得分:1)
这种循环的一个例子可能如下所示:
select top 1 * from table
DECLARE @MinPK BIGINT
DECLARE @MaxPK BIGINT
SET @MinPK=0
SET @MaxPK=0
WHILE @@ROWCOUNT>0
BEGIN
SELECT
@MaxPK=MAX(a.PK)
FROM (
SELECT TOP 3
PK
FROM Table
WHERE PK>@MinPK
ORDER BY PK ASC
) a
--Change this to an update
SELECT
PK
FROM Table
WHERE PK>@MinPK
AND PK<=@MaxPK
SET @MinPK=@MaxPK
END
答案 2 :(得分:0)
你的想法不会“奏效”,除非每组只有一个设备(这可能是荒谬的,所以我不假设)。
问题在于你必须将许多device_id值填入person表的一列中 - 这就是你首先得到一个组表的原因。