从另一个数据库中的表更新主键

时间:2010-06-28 07:56:14

标签: sql sql-server dml

我在两个不同的数据库中有两个相同的表,它们具有相同的数据但是它们具有不同的主键,我需要更新它们以便它们具有相同的键,所以我所做的是确保没有任何表具有任何键共同的,并没有重复

UPDATE db1.dbo.Table
SET db1.dbo.Table.pcol = rightPcol.pcol
FROM db1.dbo.Table
JOIN db2.dbo.Table AS rightPcol ON db1.dbo.Table.2ndIdent = db2.dbo.Table.2ndIdent

然而这导致“违反PRIMARY KEY约束。无法在对象中插入重复键”

当添加where子句以不更新db2 pcol中存在的任何db1 pcol值时,它根本没有更新任何内容,它看起来确实尝试使用db1中的主键而不是db2进行更新。

非常感谢任何和所有帮助!

//修复了轻微的拼写错误:)

2 个答案:

答案 0 :(得分:3)

说实话,没有太多可说的 - 错误信息几乎描述了它的错误。

您正在尝试将PK列更新为已存在的值。

我会仔细检查以确保

  1. 加入2ndIdent,您不会创建任何重复项。
  2. 在DB1和表上的表中确实没有任何重复项 DB2
  3. 您的SQL看起来很好,所以它必须是数据的问题。

    要检查重复项,您可以使用以下内容:

    Select 2ndIndent
    From Table
    Group By 2ndIdent
    Having Count(2ndIndent) > 1
    

答案 1 :(得分:0)

“pcol”是主键列吗?

当“rightPcol”中的主键与“db1”中的表中的任何行重复时,会出现“违反主键约束”。您应该从两个表中选择重复并解决冲突(它如何重新开发取决于您未指定的其他事物。)

所以首先应该选择重复:

SELECT T1.pcol
FROM db1.dbo.Table.pcol AS T1
INNER JOIN db2.dbo.Table.pcol AS T2
    ON T1.pcol = T2.pcol