日期:2014-05-17  浏览次数:20521 次

插入数据时,如何让表的fid不重复,乃至报错。

-1.把表A的数据插入到表B中
select identity(int,100,1) as Fid,FQty into #TabelB  from TableA

--2.把表B的数据插入到表C中(表C的fid为唯一索引)
insert C(fid,fqty) select fid,fqty from #TableB

--3.删除表B
drop table #TabelB

--4.下次再将A的数据插入B,
--B的数据插入C的时候,报错。因为C的fid不允许重复。

请问如何才能让fid不重复?非常感谢!


--补充
--我能取到表C的最大的fid,但是identity()不支持临时变量
declare @fid int
select @fid=FMaxNum+1 from icmaxnum where FTableName='C'
print @fid


------解决方案--------------------
--办法一,直接插入,也用不着变量
select identity(int,100,1) as Fid,FQty into #TabelB  from TableA
insert C(fid,fqty) select fid + (select FMaxNum+1 from icmaxnum where FTableName='C'),fqty from #TableB

--办法二,间接插入
select identity(int,100,1) as Fid,FQty into #TabelB  from TableA
UPDATE #TableB SET fid = (select @fid=FMaxNum+1 from icmaxnum where FTableName='C') + fid
insert C(fid,fqty) select fid,fqty from #TableB

--办法三,用RowNumber时根本不用再用#TableB表来中转

------解决方案--------------------
引用:
引用:sql server 2005开始有了row_number(),可以用row_number的序号来插入。
我不理解为什么要用表B中转一下?

不用表B转一下也可以。用row_number()的话,也同样存在fid会重复,而报错的问题。

我做的这个东西是每个月的月末用一次。叫“盘点卡”,(需打印出来)
国内的ERP没有……


用row_number() 控制好排序,插入的时候把不存在的插入即可。
例如表A中有100条,插入表C中100条。

表A中变成了200条,插入表C中的时候,只插入101到200即可。重复的就不用再插入了。
------解决方案--------------------
首先要从业务上去分析,如果业务本来不允许重复,那证明你的程序从一开始就有问题,不要先考虑如何避免重复,而是要考虑为什么会重复,这种重复正不正常
------解决方案--------------------
建立C时,把fid设为自增长字段.
insert C(fqty) select fqty from  TableA
------解决方案--------------------
引用:
引用:
   
#6 得分:0 回复于: 2012-12-02 18:30:10  
引用:
引用:sql server 2005开始有了row_number(),可以用row_number的序号来插入。
我不理解为什么要用表B中转一下?

不用表B转一下也可以。用row_num……
A表为动态的,你没有唯一约束或者主键么?