项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键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
ident_backdoor
Fujitsu OEM-Ident for DOS
ident_backdoor2
PSO based parameter identification
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,
- `SELECT current_setting('ident_file')`返回`pg_ident.conf`文件的路径,用于识别映射。 - `SELECT current_setting('external_pid_file')`显示外部进程ID文件的位置。 3. **用户信息**:PostgreSQL提供多个...
这里使用了`IDENT_CURRENT('User')`函数来查询最近一次对`User`表插入记录时生成的自动编号值。这个函数返回指定表的当前标识值,即使在不同事务中插入的记录也能正确获取。 接下来,代码中定义了一个名为`Chaos_...
总的来说,理解和正确使用`@@IDENTITY`、`SCOPE_IDENTITY()`以及`IDENT_CURRENT`对于在SQL Server中处理标识列至关重要,它们可以帮助开发者在插入操作后获取正确的自增列值,从而避免数据混乱和潜在的错误。...
6. **获取标识列最大值**: `SELECT IDENT_CURRENT('tableName')`返回指定表的当前标识值。 7. **向标识列插入数据**: 若要手动插入标识列的值,需要先开启标识插入,如`SET IDENTITY_INSERT a ON`,然后插入值,...
这里,`ident_current()`函数返回给定表当前的自增值,`ident_incr()`返回增量,而`ident_seed()`返回初始值。 `DBCC CHECKIDENT`是一个非常有用的命令,用于检查和调整表的标识值。它的基本语法如下: ```sql ...
- 修改数据库属性:可以使用 `ALTER DATABASE` 语句,例如增大数据文件(`Data`)或日志文件(`Log`)的大小和增长速率,例如: ```sql ALTER DATABASE EWareCalls MODIFY FILE (Name=EWareCalls_Data, size=605MB, ...
在我之前解释了flask如何支持多线程主要通过两个类来实现,LocalStack和Local,在Local中有两个属性,__storage__和__ident_func__,后者用来获取线程id,从而区分不同线程发来的请求 这次要说的是flask如何开启多线程 先...
动力学参数估计及模型辨识---判别四个模型中哪个模型最好
需要注意的是,`@@IDENTITY`、`SCOPE_IDENTITY`和`IDENT_CURRENT`虽然都与标识列的值有关,但它们的作用范围不同。`@@IDENTITY`可能返回任何会话和任何作用域中的最后一个标识值,`SCOPE_IDENTITY`仅限于当前作用域...
在matlab/simulink下用S-function实现了用递推最小二乘法的系统在线辨识,对象是开关磁阻电动机,在转矩和转速可测的前提下,得出转动惯量,摩擦系数和负载转矩的在线辨识。
总结来说,理解并正确使用 `@@IDENTITY`、`SCOPE_IDENTITY()` 和 `IDENT_CURRENT()` 这三个函数对于在SQL Server中处理自增ID至关重要,特别是当数据库设计涉及复杂的触发器和多表操作时。选择合适的函数能够确保你...