SELECT IDENT_CURRENT(tableName)和自增长列的纠结

41 篇文章 2 订阅 ¥19.90 ¥99.00
在项目中遇到一个问题,需要在插入主表数据前获取其自增长主键ID用于子表关联。尝试使用SELECT IDENT_CURRENT(TableName)获取ID,但发现当有数据被删除后,此方法可能导致主表与子表ID不一致。尝试通过DBCC CHECKIDENT进行重置,但效果不佳。最终解决方案是直接在插入子表的SQL语句中使用CONVERT(INT, IDENT_CURRENT('TableName'))来获取最新的主键ID。" 113647130,10544487,使用pyecharts与Python实现数据可视化,"['Python开发', '数据可视化', 'pyecharts', 'ECharts']
摘要由CSDN通过智能技术生成
 

 

 项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键ID值,用在插入子表时获取主键ID。在网上搜了一下,发现SELECT IDENT_CURRENT(TableName)这个语句可以实现。可是后来发现这个语句存在一个致命问题。

 

问题如下:(表中数据都为空)

(情况一)

当新建表数据为空时, IDENT_CURRENT(TableName)返回值为1.这时主表数据插入成功后,主表自增长列会自动赋值

(情况二)

   当新增一条数据并删除后, IDENT_CURRENT(TableName)返回值还是1,可是现在主表插入成功后,主表自增长列会自动赋值2,而插入子表的主表ID还是1,这样就会导致主表和子表的关联字段不一致。

 

  在网上找了几个解决方案:

1.     DBCC CHECKIDENT (tableName, RESEED, 1)

重置表的标示种子为1,可是在‘情况二’下,数据库还是会以 2 赋给主表ID字段,而不是1

2.     DBCC CHECKIDENT (tableName)

情况一下输出为:

检查标识信息: 当前标识值'null',当前列值'null'

情况二下输出为:

检查标识信息: 当前标识值'1',当前列值'1'

虽然根据输出信息不同,当数据表空时可以判断是‘情况一’还是‘情况二’,可是在C#中无论用ExecuteNonQuery, ExecuteScalar还是datatable返回的都是空数据

 

    郁闷了一个下午始终没有找到答案,最后发现用下面的方法可以实现在子表中插入主表最新记录的ID值。 直接将CONVERT(INT,IDENT_CURRENT('SalesInfo'))作为主键ID的值添加到子表sql语句即可

INSERT INTO PayInfo(SID) VALUES(CONVERT(INT,IDENT_CURRENT('STable')))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值