SQL Server:使用相关行更改主键

时间:2010-07-05 06:36:43

标签: sql-server tsql

我想更改与其他表有关系的表中一行的主键值:

例如

Table Person { Id, Name, +50 fields }
Table Address { Id, City, +10 fields }
Table Person2Address { Id, PersonId, AddressId }

我想更改Person.Id和Person2Address.PersonId

我试着像:

BEGIN TRANSACTION    
  UPDATE Pers SET Id = NewId WHERE Id = OldId
  UPDATE Person2Address SET PersonId = NewId WHERE PersonId = OldId
COMMIT TRANSACTION

但当然它提供了冲突:)

如何临时禁止外键约束或者是否有更好的方法来更改人员ID?

3 个答案:

答案 0 :(得分:4)

首先,更改主键值绝不是一个好主意。你的主要关注点应该是尽力避免这种情况。

如果您无法消除更新主键值的需要,那么最好的办法是定义这两个表之间的外键关系使用ON UPDATE CASCADE,以便对主表的主要表进行任何更改密钥将自动级联到子表。

为此,请删除现有的外键关系,然后添加:

 ALTER TABLE dbo.Person2Address
   ADD CONSTRAINT FK_Person2Address_Person
   FOREIGN KEY (PersonId) REFERENCES dbo.Person(Id)
     ON UPDATE CASCADE

如果此人的Person2Address发生变化,那么应自动更新PersonId表的Id值。

现在你应该可以打电话了

UPDATE dbo.Person SET Id = NewId WHERE Id = OldId

这应该就是全部!

答案 1 :(得分:2)

对于像这样的事情,最简单的赌注是使用类似的东西:

BEGIN TRANSACTION    
  UPDATE Pers SET tempId = NewId WHERE Id = OldId
  UPDATE Person2Address SET tempPersonId = NewId WHERE PersonId = OldId
COMMIT TRANSACTION

然后删除Id和PersonId字段并重命名临时字段。

答案 2 :(得分:1)

您可以删除FK约束并在完成后重新创建它们。

ALTER TABLE some_table DROP CONSTRAINT my_constraint

查看this文章,了解如何创建和修改约束。