作者Peruheru (还在想)
看板Database
标题[SQL ] 交易时先Delete再Insert出现违反条件约束
时间Tue Mar 1 15:12:33 2016
资料库名称: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
好像是不行的样子...
执意要做的话就只能取消条件约束了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.134.18.8
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1456816355.A.7F3.html
※ 编辑: Peruheru (220.134.18.8), 03/01/2016 15:32:57
2F:→ futureisours: delete还没commit,资料表还有相同资料当然不能inser 03/01 22:01
3F:推 likesp999: 是不是前面删除还没commit,导致後来insert的key重复 03/01 22:03
4F:→ SeanBoog: 建议你先把B复制成C 然後再分段commit试试 03/03 00:36
5F:推 streetbad: 或者建一个temp table 把新的B的内容都塞进去 03/03 02:11
6F:→ streetbad: 然後再commit delete与倒回去 03/03 02:11