2014-11-04 79 views
0

我有兩個公司在同一軟件上運行的兩個數據庫,因此DB結構是相同的。LEFT OUTER JOIN導致違反唯一鍵約束

的Windows Server 2003,MS SQL Sever的2005

我試圖項目列表和相關表格從SOURCE複製到目的地。

總共有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,有在任一源或目的地無重複分別與我的理解它的「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

更新 - 在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

+1

UNIQUE KEY約束'IN_ITEM_MEASURE_UQ_ITEM_TYPE_MEAS'的定義是什麼? – DeanOC 2014-11-04 19:51:35

+0

請回答@ DeanOC的問題,因爲最可能的問題是除了主鍵以外還有另一個唯一的密鑰 – Lamak 2014-11-04 20:01:39

+0

我很抱歉地報告,我不明白問題或者如何回答。我認爲SQL是綠色的,這是我第一次理解這些東西。 – todbanner 2014-11-04 20:10:17

回答

1

似乎最有可能受影響的表(或其它)除了擁有自己的PK一個或多個UNIQUE約束(或唯一索引)。例如,違反約束的名稱表明它可能是一個約束條件,如

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源表中的不同得到了很多混亂,但可以辦到。

+0

我想我明白你在說什麼,你不確定執行此操作會不會產生所需的效果。正如我在問題中所說的那樣,這是我正在複製的11個表格中的一個,十一箇中的八個執行沒有錯誤。一旦我擁有全部11個,這將導致兩個公司數據庫中的ITEMS列表同步。 – todbanner 2014-11-04 20:15:04

+0

如果兩家公司的表中的PK不相關,那麼查詢的結果是*垃圾*,而不是同步表。也就是說,在兩個表中出現相同的PK的情況下,如果該行的其餘部分可能不同於一個表,則您的方法不正確。在這種情況下,您遇到的約束違反是一個幸運的警告,試圖向您提供您的方法中的問題。 – 2014-11-04 20:20:15

+0

我會看看兩個表中的數據。理論上DESTINATION中的所有零件號碼與SOURCE中的零件號碼相同。因此ITEM_MEASURE_ID應該在SOURCE和DESTINATION中對於兩者都存在的記錄相同。我現在要仔細檢查一下。 – todbanner 2014-11-04 20:33:57

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有重複?

+0

該問題已經指定在任何一個表中都沒有重複。 – 2014-11-04 19:53:09

+0

您上面建議的查詢不會返回任何內容。但是,如果我並排打開這兩個表格,那麼源應該被複制到DESTINATION中的記錄超過1200個。 我在excel中打開了兩個表,排序並刪除了重複項。兩者都導致沒有重複。所以我相信這一點。 – todbanner 2014-11-04 19:57:11

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 
+0

消息8155,級別16,狀態2,行21 'temp'的列10沒有指定列。 消息8155,級別16,狀態2,行21 'temp'的列11沒有指定列。 消息8155,級別16,狀態2,行21 'temp'的列12未指定任何列。 消息8155,級別16,狀態2,行21 'temp'的列21沒有指定列。 消息207,級別16,狀態1,行31 無效的列名'記錄'。 – todbanner 2014-11-04 20:02:50

+0

糟糕,錯過了一組一組。 – 2014-11-04 20:35:44

+0

你想我運行一些不同的東西嗎? – todbanner 2014-11-04 20:52:47