zoukankan      html  css  js  c++  java
  • [转载自键舞者]SELECT IDENT_CURRENT(tableName)获得自增长列ID的实现

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

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

    (情况一)

    当新建表数据为空时, IDENT_CURRENT(TableName)返回值为1.这时主表数据插入成功后,主表自增长列会自动赋值 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('TableName'))”作为主键ID的值添加到子表sql语句即可

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

  • 相关阅读:
    Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
    Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
    Luogu P2042 [NOI2005]维护数列(平衡树)
    Luogu P1052 过河(dp)
    Luogu P1041 传染病控制(搜索)
    Luogu P2717 寒假作业(平衡树)
    Luogu P2822 组合数问题(前缀和)
    Luogu P2827 蚯蚓(模拟)
    随机图片测试
    Luogu P2458 [SDOI2006]保安站岗(树形dp)
  • 原文地址:https://www.cnblogs.com/lxzhangying/p/2198662.html
Copyright © 2011-2022 走看看