2013-04-08 58 views
-1

您好我想通过以下方式来更新一个表的外键的值:如果我去通过上面的顺序是这样更新外部表中的外键值?

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

我会将新值和旧值添加到临时表中,并通过加入来更新。 – 2013-04-08 15:49:01

回答

2

您可以临时将一列Updated BIT添加到表中,当您更新行的值时,将此位设置为1(True - 已更新) - 并避免更新那些已更新的行!

步骤1:用值来添加新列0(假 - 还没有更新):

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 
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 

您还需要删除并恢复外键约束。

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 

勒兹万