none
奇怪的主键冲突问题 RRS feed

  • 问题

  • 我这边进行一个archive的作业,将正式数据库中的数据挪到历史数据库中。

    但是报主键冲突,我这边有对比两边的数据,在正式数据库中存在的数据在历史数据库根本就没有,而且历史数据库中的数据本来也是没有重复的。

    Msg 2627, Level 14, State 1, Line 3
    Violation of PRIMARY KEY constraint 'PK__LotTest__084B3915'. Cannot insert duplicate key in object 'dbo.LotTest'.


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年10月11日 0:35

答案

  • 請問你的SQL Server是哪個版本,如果是2008以上建議使用怡紅公子所說的Merge,如果非2008,可以考慮使用下列方式來過濾重複的資料。

    use Northwind
    go
    if exists (select * from tempdb.sys.objects where type='U' and name like '#Region%')
    	drop table #Region
    go
    
    --假設#Region為Archive資料表,首先建立兩筆資料以模擬Archive資料表中已有資料,用來驗證Archive是否會insert相同資料
    select top 2 * into #Region
    from Region
    
    --Archive,利用not exits過濾已經Archive的資料
    insert into #Region
    select *
    from Region r1
    where not exists (select * from #Region r2 where r1.RegionID = r2.RegionID)
    
    select *
    from #Region
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年10月11日 1:40

全部回复

  • 或許你可以先利用Visual Studio的資料比較功能來檢查資料是否重複,或是利用協力廠商開發的資料較工具來達到相同目的。

    http://msdn.microsoft.com/zh-tw/library/aa833428(v=VS.100).aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年10月11日 0:54
  • 但是我查询了 确实是没有重复啊。。。

    这很奇怪~


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年10月11日 1:05
  • 請問你是用什麼方式來檢查資料是否重複?
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年10月11日 1:10
  • 汗 找到原因了。哎。archive的逻辑出现问题了。 在insert的那部分数据中居然出现重复了。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年10月11日 1:11
  • SELECT P.[LotTestID], P.[LotID], P.[WaferID], P.[ChipID], P.[StepID], P.[TestTemplateID], P.[TestSetupID], P.[Repeat], P.[TestDateTime], P.[Initials], P.[TestStation], P.[Temperature], P.[IsFail], P.[Note], P.[V_1], P.[V_2], P.[V_3], P.[V_4], P.[V_5], P.[V_6], P.[V_7], P.[V_8], P.[V_9], P.[V_10], P.[V_11], P.[V_12], P.[V_13], P.[V_14], P.[V_15], P.[V_16], P.[V_17], P.[V_18], P.[V_19], P.[V_20], P.[V_21], P.[V_22], P.[V_23], P.[V_24], P.[V_25], P.[V_26], P.[V_27], P.[V_28], P.[V_29], P.[V_30], P.[V_31], P.[V_32], P.[V_33], P.[V_34], P.[V_35], P.[V_36], P.[V_37], P.[V_38], P.[V_39], P.[V_40], P.[V_41], P.[V_42], P.[V_43], P.[V_44], P.[V_45], P.[V_46], P.[V_47], P.[V_48], P.[V_49], P.[V_50], P.[ChangedByUser], P.[SChangedByUser], P.[TimeChanged], P.[Shipped] INTO #A
    FROM MetroChina.dbo.LotTest AS P 
    INNER JOIN #ARC_CHIP AS T
    ON P.Lotid = T.Lotid AND P.Waferid = T.Waferid AND P.Chipid = T.Chipid

    我这样查询出来之后,有两笔记录出现二次。

    是否修改成

    SELECT P.[LotTestID], P.[LotID], P.[WaferID], P.[ChipID], P.[StepID], P.[TestTemplateID], P.[TestSetupID], P.[Repeat], P.[TestDateTime], P.[Initials], P.[TestStation], P.[Temperature], P.[IsFail], P.[Note], P.[V_1], P.[V_2], P.[V_3], P.[V_4], P.[V_5], P.[V_6], P.[V_7], P.[V_8], P.[V_9], P.[V_10], P.[V_11], P.[V_12], P.[V_13], P.[V_14], P.[V_15], P.[V_16], P.[V_17], P.[V_18], P.[V_19], P.[V_20], P.[V_21], P.[V_22], P.[V_23], P.[V_24], P.[V_25], P.[V_26], P.[V_27], P.[V_28], P.[V_29], P.[V_30], P.[V_31], P.[V_32], P.[V_33], P.[V_34], P.[V_35], P.[V_36], P.[V_37], P.[V_38], P.[V_39], P.[V_40], P.[V_41], P.[V_42], P.[V_43], P.[V_44], P.[V_45], P.[V_46], P.[V_47], P.[V_48], P.[V_49], P.[V_50], P.[ChangedByUser], P.[SChangedByUser], P.[TimeChanged], P.[Shipped] INTO #A
    FROM MetroChina.dbo.LotTest AS P 
    WHERE EXISTS (SELECT 1 FROM #ARC_CHIP AS T WHERE P.Lotid = T.Lotid AND P.Waferid = T.Waferid AND P.Chipid = T.Chipid)

    会好点呢?

    也就是将join的部分修改成exists

     这样应该就可以避免重复数据了吧?


    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

     


    • 已编辑 Wison-Ho 2011年10月11日 1:17
    2011年10月11日 1:16
  • 你要不要试一下merge?
    想不想时已是想,不如不想都不想。
    2011年10月11日 1:21
    版主
  • 你要不要试一下merge?
    想不想时已是想,不如不想都不想。
    有个参考的写法吗?
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年10月11日 1:22
  • 請問你的SQL Server是哪個版本,如果是2008以上建議使用怡紅公子所說的Merge,如果非2008,可以考慮使用下列方式來過濾重複的資料。

    use Northwind
    go
    if exists (select * from tempdb.sys.objects where type='U' and name like '#Region%')
    	drop table #Region
    go
    
    --假設#Region為Archive資料表,首先建立兩筆資料以模擬Archive資料表中已有資料,用來驗證Archive是否會insert相同資料
    select top 2 * into #Region
    from Region
    
    --Archive,利用not exits過濾已經Archive的資料
    insert into #Region
    select *
    from Region r1
    where not exists (select * from #Region r2 where r1.RegionID = r2.RegionID)
    
    select *
    from #Region
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年10月11日 1:40
  • 版本是2000的,看来只有使用exists的写法了。
    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.
    2011年10月11日 1:46