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

dsp_zerg 2012-12-02 05:37:47

-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

...全文
177 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsp_zerg 2012-12-03
  • 打赏
  • 举报
回复
引用 6 楼 maco_wang 的回复:
#6 得分:0 回复于: 2012-12-02 18:30:10 引用 4 楼 dsp_zerg 的回复: 引用 2 楼 maco_wang 的回复:sql server 2005开始有了row_number(),可以用row_number的序号来插入。 我不理解为什么要用表B中转一下? 不用表B转一下也可以。用row_number()的话,也同样存在fid会重复,而报错的问题。 我做的这个东西是每个月的月末用一次。叫“盘点卡”,(需打印出来) 国内的ERP没有…… 用row_number() 控制好排序,插入的时候把不存在的插入即可。 例如表A中有100条,插入表C中100条。 表A中变成了200条,插入表C中的时候,只插入101到200即可。重复的就不用再插入了。 ……
表A是动态表,所以第二次用row_number()很可能报错。
dsp_zerg 2012-12-03
  • 打赏
  • 举报
回复
引用 8 楼 theforever 的回复:
建立C时,把fid设为自增长字段. insert C(fqty) select fqty from TableA
C表的fid是主键。查了好多资料都无法把fid设为自增长字段。
dsp_zerg 2012-12-03
  • 打赏
  • 举报
回复
上个图,我想要实现的功能:
dsp_zerg 2012-12-03
  • 打赏
  • 举报
回复


A表的数据
dsp_zerg 2012-12-03
  • 打赏
  • 举报
回复
引用 11 楼 galenkeny 的回复:
A表为动态的,你没有唯一约束或者主键么? ……
A表没有主键和唯一约束,A表是一个“即时库存表”(仓库此时此刻的各物料的库存数量), 莫非要用游标?
以学习为目的 2012-12-03
  • 打赏
  • 举报
回复
引用 10 楼 dsp_zerg 的回复:
引用 6 楼 maco_wang 的回复: #6 得分:0 回复于: 2012-12-02 18:30:10 引用 4 楼 dsp_zerg 的回复: 引用 2 楼 maco_wang 的回复:sql server 2005开始有了row_number(),可以用row_number的序号来插入。 我不理解为什么要用表B中转一下? 不用表B转一下也可以。用row_num……
A表为动态的,你没有唯一约束或者主键么?
  • 打赏
  • 举报
回复
建立C时,把fid设为自增长字段. insert C(fqty) select fqty from TableA
發糞塗牆 2012-12-02
  • 打赏
  • 举报
回复
首先要从业务上去分析,如果业务本来不允许重复,那证明你的程序从一开始就有问题,不要先考虑如何避免重复,而是要考虑为什么会重复,这种重复正不正常
叶子 2012-12-02
  • 打赏
  • 举报
回复
引用 4 楼 dsp_zerg 的回复:
引用 2 楼 maco_wang 的回复:sql server 2005开始有了row_number(),可以用row_number的序号来插入。 我不理解为什么要用表B中转一下? 不用表B转一下也可以。用row_number()的话,也同样存在fid会重复,而报错的问题。 我做的这个东西是每个月的月末用一次。叫“盘点卡”,(需打印出来) 国内的ERP没有……
用row_number() 控制好排序,插入的时候把不存在的插入即可。 例如表A中有100条,插入表C中100条。 表A中变成了200条,插入表C中的时候,只插入101到200即可。重复的就不用再插入了。
就是just4 2012-12-02
  • 打赏
  • 举报
回复
--办法一,直接插入,也用不着变量
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表来中转
dsp_zerg 2012-12-02
  • 打赏
  • 举报
回复
引用 2 楼 maco_wang 的回复:
sql server 2005开始有了row_number(),可以用row_number的序号来插入。 我不理解为什么要用表B中转一下?
不用表B转一下也可以。用row_number()的话,也同样存在fid会重复,而报错的问题。 我做的这个东西是每个月的月末用一次。叫“盘点卡”,(需打印出来) 国内的ERP没有这个东西,只好开发下。 就是将ERP中的月底的每个物料的库存数(表A),形成一张张单据(表C,也就是盘点卡)。
dsp_zerg 2012-12-02
  • 打赏
  • 举报
回复
引用 1 楼 maco_wang 的回复:
把fid改成自增列,然后插入的时候不需要插入这列即可。
fid是ERP系统C表的PK,不知道这样修改会不会产生其他问题。 版主,还有其他方法吗?
叶子 2012-12-02
  • 打赏
  • 举报
回复
sql server 2005开始有了row_number(),可以用row_number的序号来插入。 我不理解为什么要用表B中转一下?
叶子 2012-12-02
  • 打赏
  • 举报
回复
把fid改成自增列,然后插入的时候不需要插入这列即可。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧