2012-01-30 54 views
1

我有一套臨時表,我接受數據,擦洗和清理它們,然後再插入到目標表中。目標表有一個主鍵約束,我插入的是主鍵。由於截斷/刪除SQL Server主鍵違例?

我在插入之前檢查目標表中是否存在主鍵。我插入只在目標表中沒有記錄的基礎上,主鍵的缺席:

INSERT INTO Target 
    SELECT 
     primKey 
     , user_state 
     , test_state 
    FROM 
     myStagingTable3 

至此,該stagingTable3只有使用下面的where子句中不存在目標表中的數據:

WHERE 
     primKey not in (Select primKey from Target) 

不知怎的,我得到一個主鍵衝突錯誤:

消息2627,級別14,狀態1(步驟在行#失敗...) 違反主鍵的常量raint'pk1101AE'。不能插入對象「目標」

我的問題 重複鍵:

  • 下可以當 關鍵,我想插入不存在於目標表中的主鍵衝突發生什麼情況?
  • 可以事先刪除記錄導致主鍵被保留?如果是這樣, 可以以某種方式解決這個問題嗎?
  • 別的東西?

這很明顯,我的登臺表有鑰匙,而目標表沒有。然而插入失敗。

+0

我要補充一點,我閱讀這篇文章:http://stackoverflow.com/questions/5278588/violation-of-primary-key-constraint-sql-error刪除/截斷問題很有趣。只是不知道如何解決它。這種小菜。謝謝。 – user991945 2012-01-30 00:12:17

+0

最有可能您的登臺表包含'primKey'的多個值。 – dasblinkenlight 2012-01-30 00:20:41

+0

嗯,我只是檢查了......這是真的......它確實有primKey的多個值。這意味着第二個關鍵值是導致錯誤的原因,所以整個事情都保留下來並且事務被回滾。如果我不能清除重複項,我可能會在這裏查看MERGE聲明。這樣,我可以在插入後更新。總是檢查簡單的東西 – user991945 2012-01-30 01:24:35

回答

2

發生這種情況是因爲您的登臺表包含具有相同primKey值的多行。

如果不要緊,你該複製者之間{user_state, test_state}對使它到插入,你完全可以通過添加一個簡單的group by,這樣繞過這個問題:

INSERT INTO Target 
    (SELECT 
     primKey 
    , MAX(user_state) 
    , MAX(test_state) 
    FROM 
     myStagingTable3 
    GROUP BY primKey)