-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 时,我会将值与先前将值 1 更改为 5 的更新语句结果混合。

如何在不将它们与早期结果混合的情况下更新这些值。

4

3 回答 3

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 
于 2013-04-08T15:48:30.437 回答
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

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

于 2013-04-08T15:48:52.790 回答
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

拉兹万

于 2013-04-08T18:28:43.173 回答