2012-10-04 108 views
1

我已經將某些記錄從DB_1中的我的SOURCE表中移動到另一個DB_2中的ARCHIVE表中(即將記錄從源插入ARCHIVE,然後從源刪除記錄。)Sybase抱怨重複插入,如果不存在

我的源表具有以下索引創建爲SOURCE_1

CREATE UNIQUE NONCLUSTERED INDEX SOURCE_1 
    ON dbo.SOURCE(TRADE_SET_ID, ORDER_ID) 

的問題是 - 當我嘗試將行插入回從歸檔源時,Sybase引發以下錯誤:

Attempt to insert duplicate key row in object 'SOURCE' with unique index 'SOURCE_1' 

而且,當然,隨後插入失敗。

我證實,我的源表中沒有這些重複,因爲下面的查詢返回的空:

select * from DB_1.dbo.SOURCE 
join DB_2.dbo.ARCHIVE 
on DB_1.dbo.SOURCE.TRADE_SET_ID = DB_2.dbo.ARCHIVE.TRADE_SET_ID 
AND DB_1.dbo.SOURCE.ORDER_ID = DB_2.dbo.ARCHIVE.ORDER_ID 

如果上面的查詢返回的什麼都沒有,那意味着我還沒有違反在2我的唯一索引約束但是Sybase聲稱我有。

有沒有人有任何想法,爲什麼發生這種情況?

+0

我真的沒有看到任何錯誤(除了最後一個查詢中,第一個條件是DB2而不是DB_2)。你沒有任何公開的交易或任何事情,是嗎? –

+0

一種可能性是空的。空值是唯一的,不會被該查詢找到。 – Paparazzi

+0

亞當 - 雅是一個錯誤,但沒有公開交易。 Blam - 我確實有NULL,但我也在其他表中有NULL,並且沒有其他表的問題。 – czchlong

回答

1

如果Sybase在這方面與SQL Server類似(我更熟悉),我會懷疑索引阻塞了插入。嘗試在複製之前禁用歸檔版本的索引(以及任何其他索引或自動增量列),然後重新啓用。 Sybase可能會嘗試自動爲插入創建ID,這會干擾現有記錄。

+0

這是一個非常有趣的命題湯姆。但是,如果我禁用然後啓用索引,是不是必須重建該索引?該表是一個龐大的表100M +行...我不認爲重新創建索引將使我的DBA非常高興。 – czchlong

+0

不要擔心禁用和重新啓用主表上的索引,只能在要備份的存檔上。由於它是一個歸檔表,並且不太可能經常使用,所以額外的時間應該是最小的關注。 –