【问题标题】:SQL Server 2008 : update the table with primary keySQL Server 2008:使用主键更新表
【发布时间】:2016-02-25 21:23:00
【问题描述】:

我修改了开发数据库中的表,并希望使用开发服务器中的新数据更新生产数据库中的同一个表。请让我解释一下...

例如,

发展表:

表名:ParentTableParentID 是自动增量#和主键)

ParentID        Name    Value
------------------------------
1               Z       A-1    (change value to Z)
2               B       B-1    (will delete the record completely)
3               C       C-1
4               D       D-1
5               E       E-1
6               F       F-1
7               G       G-1
8               H       H-1
9               I       I-1

生产表:

表名:ParentTableParentID 是自动增量#和主键)

ParentID        Name    Value
-----------------------------
1               A       A-1 
2               B       B-1  
3               C       C-1
4               D       D-1
5               E       E-1
6               F       F-1
7               G       G-1
8               H       H-1
9               I       I-1

首先,请注意ParentID 是自动增量#,也是主键。 ParentTable与其他人之间也有关系。

在DEV服务器上,我用parentID# 1把名字从“A”改成了“Z”,我还删除了parentID# 2的记录。

由于 DEV 服务器上的 parentID# 2 记录已被删除,假设我将从生产服务器上与 ParentID# 2 关联的其他表中删除所有记录。

有什么好的方法可以更新生产环境中的ParentTable,使其看起来与开发服务器上的ParentTable 完全相同?

提前致谢

【问题讨论】:

  • 这是一次性更新还是持续/即时需要?
  • 只有一次更新。谢谢

标签: sql sql-server-2008


【解决方案1】:

假设两个数据库在同一台服务器(或链接服务器)上。你可以做一个MERGE 查询。如果没有,您可以使用 UPDATE 查询更新这些值。

MERGE INTO ProductionDB.Schema.ParentTable A
USING DevelopmentDB.Schema.ParentTable B
ON A.ParentID = B.ParentID
WHEN MATCHED THEN
UPDATE SET A.Name = B.Name, A.Value = B.Value;

当然要替换您的服务器/数据库名称。但这是您正在寻找的粗略示例。

【讨论】:

  • 对不起,数据库在不同的服务器上,但我已经创建了 LinkedServer。我还能使用 MERGE 吗?
  • 是的。这也应该在链接服务器上工作。只要您可以引用这两个表。
  • 您是否可以根据我发布的那两个表格向我提供示例?恐怕我无法在维护之夜弄清楚这一点。谢谢。
  • 对于 MERGE,我不需要先正确“设置 identity_insert Prod.dbo.ParentTable on”。它会处理主键对吗?
  • 没错。合并查询只是使用另一个表中的数据更新数据。
【解决方案2】:

我可能会尝试类似:

declare @parentOffset int
begin transaction

select @parentOffset = max(ParentID) from Prod.dbo.ParentTable (holdlock)

set identity_insert Prod.dbo.ParentTable on

insert into Prod.dbo.ParentTable ( ParentID , Name , Value )
select Dev.dbo.ParentTable.ParentID + @parentOffset , Dev.dbo.ParentTable.Name , Dev.dbo.ParentTable.Value
from Dev.dbo.ParentTable.ParentTable

set identity_insert Prod.dbo.ParentTable off

insert into Prod.dbo.ChildTable ( ParentID , SomeOtherField )
select Dev.dbo.ChildTable.ParentID + @parentOffset , Dev.dbo.ChildTable.SomeOtherField

commit transaction

显然,在您在生产中扣动扳机之前,先针对离线副本对其进行测试,并且会进行一些错误处理,但这应该可以完成工作。它不会测试表中是否已经存在值,但您可以通过稍微修改并通过临时表来处理它。不清楚这是您的情况,还是您只是想添加。

【讨论】:

  • 非常感谢您提供示例。这对我行得通。我将创建另一个表并先离线测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多