Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:更改具有相关行的主键_Sql Server_Tsql - Fatal编程技术网

Sql server SQL Server:更改具有相关行的主键

Sql server SQL Server:更改具有相关行的主键,sql-server,tsql,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 = NewI

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

比如说

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
BEGIN TRANSACTION    
  UPDATE Pers SET tempId = NewId WHERE Id = OldId
  UPDATE Person2Address SET tempPersonId = NewId WHERE PersonId = OldId
COMMIT TRANSACTION
但它当然提供了冲突:)


如何临时抑制外键约束,或者是否有更好的方法更改person的Id

对于这类事情,最简单的方法是使用以下内容:

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

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

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

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

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

 ALTER TABLE dbo.Person2Address
   ADD CONSTRAINT FK_Person2Address_Person
   FOREIGN KEY (PersonId) REFERENCES dbo.Person(Id)
     ON UPDATE CASCADE
然后,如果此人的
Id
发生变化,则会自动更新
Person2Address
表的
PersonId

现在你应该可以打电话了

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

这应该就是全部了

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

ALTER TABLE some_table DROP CONSTRAINT my_constraint

检查文章以创建和修改约束。

测试不好的代码插入了{0000-0000-0000}guid值作为PK,因此我想更改它。谢谢,我会试着回答你,但看起来@marc_的方法似乎更简单