`
feiliboos
  • 浏览: 672749 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键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('SalesInfo'))作为主键ID的值添加到子表sql语句即可

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

分享到:
评论

相关推荐

    数据库练习(知识点蛮多)

    insert into cj_t values(IDENT_CURRENT('xs_t'),3,66,1) insert into cj_t values(IDENT_CURRENT('xs_t'),4,75,1) insert into cj_t values(IDENT_CURRENT('xs_t'),5,73,1) insert into xs_t values('1','Tom','...

    ident_process_owner.nasl

    ident_process_owner

    ident_backdoor.nasl

    ident_backdoor

    OEM-Ident_OEM-Ident_fujitsu_源码

    Fujitsu OEM-Ident for DOS

    ident_backdoor2.nasl

    ident_backdoor2

    IDENT_using_PSO_matlab_blanket43v_

    PSO based parameter identification

    得到自增列的下一个会插入的id

    Select so.name Table_name, –表名字 sc.name Iden_Column_name, –自增字段名字 ident_current(so.name) curr_value, –自增字段当前值 ident_incr(so.name) incr_value, –自增字段增长值 ident_seed(so.name) ...

    SIMATIC Ident RFID 系统 SIMATIC RF XML 编程 功能手册[手册].pdf

    SIMATIC Ident RFID 系统 SIMATIC RF XML 编程 功能手册[手册]pdf,

    postgresql 小技巧

    - `SELECT current_setting('ident_file')`返回`pg_ident.conf`文件的路径,用于识别映射。 - `SELECT current_setting('external_pid_file')`显示外部进程ID文件的位置。 3. **用户信息**:PostgreSQL提供多个...

    C 中使用ADO—NET连接SQLServer数据库.docx

    这里使用了`IDENT_CURRENT('User')`函数来查询最近一次对`User`表插入记录时生成的自动编号值。这个函数返回指定表的当前标识值,即使在不同事务中插入的记录也能正确获取。 接下来,代码中定义了一个名为`Chaos_...

    @@IDENTITY与SCOPE_IDENTITY()

    总的来说,理解和正确使用`@@IDENTITY`、`SCOPE_IDENTITY()`以及`IDENT_CURRENT`对于在SQL Server中处理标识列至关重要,它们可以帮助开发者在插入操作后获取正确的自增列值,从而避免数据混乱和潜在的错误。...

    SQL SERVER实例学习总结.docx

    6. **获取标识列最大值**: `SELECT IDENT_CURRENT('tableName')`返回指定表的当前标识值。 7. **向标识列插入数据**: 若要手动插入标识列的值,需要先开启标识插入,如`SET IDENTITY_INSERT a ON`,然后插入值,...

    SQL SERVER 自增列

    这里,`ident_current()`函数返回给定表当前的自增值,`ident_incr()`返回增量,而`ident_seed()`返回初始值。 `DBCC CHECKIDENT`是一个非常有用的命令,用于检查和调整表的标识值。它的基本语法如下: ```sql ...

    SQL 2000 日记

    - 修改数据库属性:可以使用 `ALTER DATABASE` 语句,例如增大数据文件(`Data`)或日志文件(`Log`)的大小和增长速率,例如: ```sql ALTER DATABASE EWareCalls MODIFY FILE (Name=EWareCalls_Data, size=605MB, ...

    flask开启多线程的具体方法

    在我之前解释了flask如何支持多线程主要通过两个类来实现,LocalStack和Local,在Local中有两个属性,__storage__和__ident_func__,后者用来获取线程id,从而区分不同线程发来的请求 这次要说的是flask如何开启多线程 先...

    KineticsEst_Ident2.rar_kinetic model_matlab参数辨识_动力学模型_动力学辨识_参数动力

    动力学参数估计及模型辨识---判别四个模型中哪个模型最好

    对有insert触发器表取IDENTITY值时发现的问题

    需要注意的是,`@@IDENTITY`、`SCOPE_IDENTITY`和`IDENT_CURRENT`虽然都与标识列的值有关,但它们的作用范围不同。`@@IDENTITY`可能返回任何会话和任何作用域中的最后一个标识值,`SCOPE_IDENTITY`仅限于当前作用域...

    rls_ident.rar_RLS_simulink_simulink 辨识_惯量 辨识_负载转矩_转速辨识

    在matlab/simulink下用S-function实现了用递推最小二乘法的系统在线辨识,对象是开关磁阻电动机,在转矩和转速可测的前提下,得出转动惯量,摩擦系数和负载转矩的在线辨识。

    使用SQL Server 获取插入记录后的ID(自动编号)

    总结来说,理解并正确使用 `@@IDENTITY`、`SCOPE_IDENTITY()` 和 `IDENT_CURRENT()` 这三个函数对于在SQL Server中处理自增ID至关重要,特别是当数据库设计涉及复杂的触发器和多表操作时。选择合适的函数能够确保你...

Global site tag (gtag.js) - Google Analytics