您好我想以下列方式更新表中的外键值:
FK
1 to 5
2 to 6
3 to 7
4 to 1
5 to 2
6 to 3
7 to 4
但是,如果按顺序执行上述操作:
update table set fk = 5 where fk=1
当我想更新值5时,id会将值与先前更新语句结果混合,后者已将值1更改为5。
如何在不将它们与早期结果混合的情况下更新这些值。
答案 0 :(得分:2)
您可以临时向表中添加列Updated BIT
,当您更新行的值时,将此位设置为1
(True - 已更新) - 并避免更新已经存在的行已更新!
第1步:添加值为0
的新列(false - 尚未更新):
ALTER TABLE dbo.YourTable
ADD Updated BIT NOT NULL DEFAULT(0) WITH VALUES
第2步:进行更新 - 尊重Updated
标志!
UPDATE dbo.YourTable
SET fk = 5, Updated = 1
WHERE fk = 1 AND Updated = 0
第3步:一旦更新所有内容 - 再次删除列
ALTER TABLE dbo.YourTable
DROP COLUMN Updated
答案 1 :(得分:2)
您可以使用另一列作为FreshPrince建议。添加新列,将其设置为适当的值,然后将键更改为新列。
另一种方法可能是使用该范围之外的一组值。这将消除添加和删除列的需要。所以......
update table set fk = 15 where fk=1
1 to 15
2 to 16
3 to 17
4 to 11
5 to 12
6 to 13
7 to 14
然后直接更新以从所有行中减去10。
update table set fk = fk - 10
您还需要删除并恢复外键约束。
答案 2 :(得分:0)
您还可以使用CASE表达式在单个UPDATE语句中指定新值:
UPDATE YourTable
SET fk=CASE fk
WHEN 1 THEN 5
WHEN 2 THEN 6
WHEN 3 THEN 7
WHEN 4 THEN 1
WHEN 5 THEN 2
WHEN 6 THEN 3
WHEN 7 THEN 4
END
WHERE fk IN (1,2,3,4,5,6,7)
在这种特殊情况下,您还可以使用:
UPDATE YourTable
SET fk=(fk+3)%7+1
WHERE fk BETWEEN 1 AND 7
勒兹