0

我有两个公司的两个数据库在同一个软件上运行,因此数据库结构是相同的。

Windows 服务器 2003,MS SQL 服务器 2005。

我正在尝试将项目列表和关联表从 SOURCE 复制到 DESTINATION。

总共有 11 个表,我使用相同的脚本格式来完成所有 11 个表的工作。其中三个失败了。

下面的例子是三个之一:

--dbo.ITEM_MEASURE 5
SET IDENTITY_INSERT DESTINATION.dbo.ITEM_MEASURE ON

INSERT DESTINATION.dbo.ITEM_MEASURE(
  ITEM_MEASURE_ID, MEAS_TYPE, ITEMNO, MEAS_CODE, SELLPRIC, MARKUP, S_PERC_DOC, 
  MIN_AMOUNT, COSTPERSP, COST, COST_LOW, COST_HIGH, WEIGHT_MEAS, WEIGHT,
  SIZE_MEAS, LENGTH, BREADTH, HEIGHT, VOLUME_MEAS, VOLUME, LAST_COST)
SELECT s.ITEM_MEASURE_ID, s.MEAS_TYPE, s.ITEMNO, s.MEAS_CODE, s.SELLPRIC,
  s.MARKUP, s.S_PERC_DOC, s.MIN_AMOUNT, s.COSTPERSP, '0', '0', '0' ,
  s.WEIGHT_MEAS, s.WEIGHT, s.SIZE_MEAS, s.LENGTH, s.BREADTH, s.HEIGHT,
  s.VOLUME_MEAS, s.VOLUME, '0'
FROM SOURCE.dbo.ITEM_MEASURE s
  LEFT OUTER JOIN DESTINATION.dbo.ITEM_MEASURE d
    ON (d.ITEM_MEASURE_ID = s.ITEM_MEASURE_ID)
WHERE d.ITEM_MEASURE_ID IS NULL

SET IDENTITY_INSERT DESTINATION.dbo.ITEM_MEASURE OFF

/* ERROR
Msg 2627, Level 14, State 1, Line 73
Violation of UNIQUE KEY constraint 'IN_ITEM_MEASURE_UQ_ITEM_TYPE_MEAS'. Cannot insert duplicate key in object 'dbo.ITEM_MEASURE'.
The statement has been terminated.
*/

表 PK 是 ITEM_MEASURE_ID,分别在 SOURCE 或 DESTINATION 中没有重复项,据我了解,“WHERE d.ITEM_MEASURE_ID IS NULL”语句阻止它尝试将数据复制到已经存在的 DESTINATION 中。

为什么我会收到此错误?

更新 - 无法发布图像,但这里是约束和索引的一个看看。:
https ://photos-6.dropbox.com/t/1/AAD2EzrJTZFy_BMqcL5i2dWmZn1bAp5C7Y6LAHwJZ1btYQ/12/1501690/png/1024x768/3/1415138400/ 0/2/constraint.png/vvHTaOuDXOO72MN7IYeDnbLzAjQ65deom5zF9GV3jgw

UPDATE - Properties on IN_ITEM_MEASURE_UQ_ITEM_TYPE_MEASURE: https://photos-3.dropbox.com/t/1/AAC8eurM2o8SfHfvLNOsvwt8h_2P_qGpvRBmhovIp3cJzg/12/1501690/png/1024x768/3/1415142000/0/2/properties.PNG/Lf4Q_hE1QTsHgEI1BAxR9WoyL2R71MPFxDZJ5R9kXN0

4

3 回答 3

1

UNIQUE除了 PK 之外,受影响的表(可能还有其他表)似乎最有可能具有一个或多个约束(或唯一索引)。例如,违反约束的名称表明它可能是一个约束,例如

UNIQUE(ITEMNO, MEAS_TYPE)

...或此类列集合上的唯一索引。没有特别的理由假设在两个不相关的数据库中,相等的 (ITEMNO, MEAS_TYPE) 对(或任何其他非 PK 数据)将与相同的 PK 相关联,因此您避免 PK 违规的策略不一定能避免违规诸如此类的约束。

就此而言,您没有提出任何理由相信源表和目标表中的 PK 以任何方式相关。尽管它可能使表复制继续进行而不会出错,但我认为没有理由相信您提供的查询实际上是在做正确的事情。

编辑添加:事实上,它看起来像是ITEM_MEASURE_ID一个代理键(即由应用程序或 DBMS 发明的,独立于任何数据)。通过这样的键将源数据与独立记录的目标数据相匹配是极不可能为您提供有意义的结果的(在其他表中也不)。您应该改用自然键,例如(ITEMNO, MEAS_TYPE)确实适合。在您的表上有UNIQUE约束或唯一索引的地方,它们可以作为自然键的线索。对于这个单独的表,它可能看起来像这样:

-- NOTE: NOT inserting values for the IDENTITY column

INSERT DESTINATION.dbo.ITEM_MEASURE(
  MEAS_TYPE, ITEMNO, MEAS_CODE, SELLPRIC, MARKUP, S_PERC_DOC, 
  MIN_AMOUNT, COSTPERSP, COST, COST_LOW, COST_HIGH, WEIGHT_MEAS, WEIGHT,
  SIZE_MEAS, LENGTH, BREADTH, HEIGHT, VOLUME_MEAS, VOLUME, LAST_COST)
SELECT s.MEAS_TYPE, s.ITEMNO, s.MEAS_CODE, s.SELLPRIC,
  s.MARKUP, s.S_PERC_DOC, s.MIN_AMOUNT, s.COSTPERSP, '0', '0', '0' ,
  s.WEIGHT_MEAS, s.WEIGHT, s.SIZE_MEAS, s.LENGTH, s.BREADTH, s.HEIGHT,
  s.VOLUME_MEAS, s.VOLUME, '0'
FROM SOURCE.dbo.ITEM_MEASURE s
  LEFT OUTER JOIN DESTINATION.dbo.ITEM_MEASURE d
    ON (d.ITEMNO = s.ITEMNO) AND (d.MEAS_TYPE = s.MEAS_TYPE)
WHERE d.ITEMNO IS NULL

如果您需要处理相关的源表,这会变得更加混乱,因为目标表中的 PK 与源表中的 PK 不同,但可以做到。

于 2014-11-04T20:02:16.380 回答
0

我要尝试的第一件事是做一个选择语句来查看冲突是什么。

SELECT * FROM DESTINATION.dbo.ITEM_MEASURE
WHERE ITEM_MEASURE_ID IN (SELECT s.ITEM_MEASURE_ID FROM SOURCE.dbo.ITEM_MEASURE s
 LEFT OUTER JOIN DESTINATION.dbo.ITEM_MEASURE d ON (d.ITEM_MEASURE_ID = s.ITEM_MEASURE_ID)
WHERE d.ITEM_MEASURE_ID IS NULL)

这应该告诉你什么是冲突的。除此之外,DESTINATION.dbo.ITEM_MEASURE 是否可能有重复项?

于 2014-11-04T19:51:45.880 回答
0

这是一个格式化的评论。当你运行它时会发生什么?

select item_measure_id, count(*) records
from (SELECT s.ITEM_MEASURE_ID, s.MEAS_TYPE, s.ITEMNO, s.MEAS_CODE, s.SELLPRIC,
s.MARKUP, s.S_PERC_DOC, s.MIN_AMOUNT, s.COSTPERSP, '0', '0', '0' ,
s.WEIGHT_MEAS, s.WEIGHT, s.SIZE_MEAS, s.LENGTH, s.BREADTH, s.HEIGHT,
s.VOLUME_MEAS, s.VOLUME, '0'
FROM SOURCE.dbo.ITEM_MEASURE s
LEFT OUTER JOIN DESTINATION.dbo.ITEM_MEASURE d
ON (d.ITEM_MEASURE_ID = s.ITEM_MEASURE_ID)
WHERE d.ITEM_MEASURE_ID IS NULL
) temp
group by item_measure_id
having records > 1
order by records desc
于 2014-11-04T19:57:40.167 回答