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

And*_*rko 6 t-sql sql-server

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

例如

Table Person { Id, Name, +50 fields }
Table Address { Id, City, +10 fields }
Table Person2Address { Id, PersonId, AddressId }
Run Code Online (Sandbox Code Playgroud)

我想更改Person.Id和Person2Address.PersonId

我试着像:

BEGIN TRANSACTION    
  UPDATE Pers SET Id = NewId WHERE Id = OldId
  UPDATE Person2Address SET PersonId = NewId WHERE PersonId = OldId
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

但当然它提供了冲突:)

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

mar*_*c_s 4

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

如果您无法消除更新主键值的需要,那么最好的选择是定义要使用的这两个表之间的外键关系ON UPDATE CASCADE,以便对主表主键的任何更改都会自动级联到儿童表。

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

 ALTER TABLE dbo.Person2Address
   ADD CONSTRAINT FK_Person2Address_Person
   FOREIGN KEY (PersonId) REFERENCES dbo.Person(Id)
     ON UPDATE CASCADE
Run Code Online (Sandbox Code Playgroud)

如果人员的信息发生变化,那么Person2Address表的值应该会自动更新。PersonIdId

现在你应该可以打电话了

UPDATE dbo.Person SET Id = NewId WHERE Id = OldId
Run Code Online (Sandbox Code Playgroud)

这应该就是全部了!

  • 测试错误的代码插入了 {0000-0000-0000} guid 值作为 PK,所以我想更改它。谢谢你,我会尝试 (3认同)