[SQL ] 交易時先Delete再Insert出現違反條件約束

作者: Peruheru (還在想)   2016-03-01 15:12:33
資料庫名稱:MS SQL Server
資料庫版本:2008
內容/問題描述:
資料庫內有兩張結構相近的表,而我要把資料從A表轉到B表
A跟B表都有同樣的UNIQUE Key:ID,型態是char(8)只存英數
因為中間操作很多,所以有使用交易避免只改一半的情況
然後B表的現存資料。全部都要刪掉Delete以後才新增Insert進去
大概就像這樣:
begin tran
Delete From B
Insert Into B (ID, Column1, Column2,...)
Select ID, Column1, Column2,...
From A
Where Not Exists(Select 1 From B Where ID = A.ID)
commit
語法中where的部分是避免寫入重複資料,這段語法也會用在純粹新增時(不先刪除)
可是
在執行時就會產生錯誤說我違反條件約束插入同樣的ID
但是我不是已經先全刪了嗎...
如果是不刪除的話,這段語法反而不會失敗
看起來像是因為交易中的暫時狀態讓該ID還佔著在B裡面的位置
所以才會認為該資料仍然存在?
請問有什麼方法在依循目前流程的情況下成功插入資料呢?
謝謝各位
=============
剛發完就自己找到類似的問題
http://tinyurl.com/jc3luox
好像是不行的樣子...
執意要做的話就只能取消條件約束了
作者: rockchangnew (rock)   2016-03-01 21:21:00
作者: futureisours (ccc)   2016-03-01 22:01:00
delete還沒commit,資料表還有相同資料當然不能inser
作者: likesp999 (大腸桿菌)   2016-03-01 22:03:00
是不是前面刪除還沒commit,導致後來insert的key重複
作者: SeanBoog (施吉祥先生)   2016-03-03 00:36:00
建議你先把B複製成C 然後再分段commit試試
作者: streetbad (翊)   2016-03-03 02:11:00
或者建一個temp table 把新的B的內容都塞進去然後再commit delete與倒回去

Links booklink

Contact Us: admin [ a t ] ucptt.com