2

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

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

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

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

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

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

4

2 回答 2

3

老实说,没什么好说的 - 错误消息几乎描述了它出了什么问题。

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

我会仔细检查以确保

  1. 通过加入 2ndIdent,您不会创建任何重复项。
  2. DB1 和 DB2 上的表中确实没有任何重复项

您的 SQL 看起来不错,所以它一定是数据的问题。

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

Select 2ndIndent
From Table
Group By 2ndIdent
Having Count(2ndIndent) > 1
于 2010-06-28T08:03:38.417 回答
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
于 2010-06-28T08:05:25.830 回答