首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么SCOPE_IDENTITY()在一个表的insert之后返回NULL,而在另一个表上却没有?

SCOPE_IDENTITY()是一个SQL Server函数,用于获取最近插入的行的标识列的值。它返回最近插入的标识列的值,但只在当前会话的范围内有效。

当SCOPE_IDENTITY()在一个表的insert之后返回NULL,而在另一个表上却没有,可能是由于以下原因:

  1. 表设计问题:可能是在第一个表中没有定义标识列,或者标识列没有设置为自增。SCOPE_IDENTITY()只能返回自增标识列的值,如果没有自增标识列,它将返回NULL。
  2. 作用域问题:SCOPE_IDENTITY()函数的返回值受到作用域的限制。如果在插入第一个表后,执行了一些其他操作(例如触发器、存储过程等),这些操作可能会改变SCOPE_IDENTITY()的值或作用域,导致在第二个表上返回NULL。
  3. 并发问题:如果在插入第一个表后,有其他会话或线程同时插入了数据,并且在你执行SCOPE_IDENTITY()之前,这些插入操作已经提交,那么SCOPE_IDENTITY()可能会返回NULL。这是因为SCOPE_IDENTITY()只返回当前会话中最近插入的标识列的值。

为了解决这个问题,可以尝试以下方法:

  1. 确保第一个表中有一个自增的标识列,并且已经正确设置。
  2. 检查是否有其他操作在插入第一个表后被执行,可能会改变SCOPE_IDENTITY()的值或作用域。可以通过查看触发器、存储过程等来排查。
  3. 确保没有并发的插入操作在你执行SCOPE_IDENTITY()之前提交。可以通过使用事务或锁定机制来控制并发。

腾讯云相关产品和产品介绍链接地址:

相关搜索:为什么我的搜索域在一个表上有效,而在另一个表上不起作用?为什么mysql存储过程在一个环境中返回null结果,而在另一个环境中不返回?在另一个表上具有LIKE的PostgreSQL筛选表在一个工作表上基于动态自动筛选在另一个工作表上创建图表-返回错误范围SQL/PHP:在另一个表(多个表)上没有匹配的联接在来自另一个表的副本上插入返回考勤在一个表中,姓名在另一个表中的出席用户列表在update或insert之后更新同一个表的PL/SQL触发器SQL触发器,用于在插入另一个表之后删除一个表中的记录为什么在一个上的数组拷贝上出现Java数组布尔错误,而在另一个上没有?为什么我的临时文件在一个PHP页面上被删除,而在另一个页面上却没有?删除在另一个工作表上找到的某一行之后的所有行为什么SYSIBM.SYSCOLUMNS上的COLCARDF字段在表空间上的runstat之后等于0?在另一个表的主键上创建外键我插入的从另一个表中选择的值的列为null。为什么?为什么我的登录页面在一个分支上有效,而在另一个分支上无效?当我从另一个表空间查询我在一个表空间中创建的表时,为什么不显示它?我的排序过程在第一个工作表上运行,但在另一个工作表上不运行在循环中将一个工作表上的字符串转换为另一个工作表上的数字如何创建一个SQL触发器,该触发器在另一个表的活动之后对另一个表进行更新?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL Server 返回最后插入记录自动编号ID

SCOPE_IDENTITY 返回为当前会话和当前作用域中任何最后生成标识值 SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中任何内所生成最后一个标识值。...但是,SCOPE_IDENTITY返回插入到当前作用域中值;@@IDENTITY 不受限于特定作用域。 例如,有两个 T1 和 T2, T1 定义了一个 INSERT 触发器。...此例说明了两个作用域:一个 T1 插入,另一个是作为触发器结果在 T2 插入。...假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 INSERT 语句最后返回不同值。...SCOPE_IDENTITY() 返回插入 T1 中 IDENTITY 值,该值是发生在相同作用域中最后一个 INSERT

2.2K40
  • @@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者异同

    @@IDENTITY AS Iden  --返回tb中Identity列值为2 --Result : Iden -------- 2 --2.SCOPE_IDENTITY:返回当前作用域中标识列内最后一个标识值...]; --Result:返回tb中最后Identity为3,当前作用域中最后Identity为6,即ta中最后Identity为6 Identity --------- 3 (1...row(s) affected) SCOPE_IDENTITY ---------- 6 (1 row(s) affected) --3.IDEN_CURRENT 返回指定或视图生成最后一个标识值...● @@IDENTITY 返回为跨所有作用域的当前会话中某个生成最新标识值。 ● SCOPE_IDENTITY 返回为当前会话和当前作用域中某个生成最新标识值。...● IDENT_CURRENT 返回为某个会话和或作用域中指定生成最新标识值。

    40620

    @@IDENTITY与SCOPE_IDENTITY() 及IDENT_CURRENT 区别

    如果语句未影响任何包含标识列,则 @@IDENTITY 返回 NULL。如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成标识值。...如果对包含标识列执行插入操作后触发了触发器,并且触发器对另一个没有标识列执行了插入操作,则 @@IDENTITY 将返回第一次插入标识值。...@@IDENTITY 和 SCOPE_IDENTITY 可以返回当前会话中所有中生成最后一个标识值。...若要获得其他服务器标识值,请在远程服务器或链接服务器执行存储过程,并使(远程或链接服务器环境中执行)该存储过程收集标识值,并将其返回本地服务器发出调用连接。...比如,我有 A 和 B 两个,现在我 A 定义了一个Insert触发器,当在 A 中插入一条数据时,自动 B 也插入一条数据。

    1K30

    MYSQL中获取得最后一条记录语句

    方法1:select max(id) from tablename 方法2:select last_insert_id(); MySQL中,使用auto_increment类型id字段作为主键,...但是具体生成id时候,我们操作顺序一般是:先在主表中插入记录,然后获得自动生成id,以它为基础插入从记录。这里面有个困 难,就是插入主表记录后,如何获得它对应id。...下面通过实验说明:   1、连接1中向A插入一条记录,A包含一个auto_increment类型字段。   2、连接2中向A再插入一条记录。   ...3、结果:连接1中执行select LAST_INSERT_ID()得到结果和连接2中执行select LAST_INSERT_ID()结果是不同而在两个连接中执行select max(id)...使用SCOPE_IDENTITY()可以 获得插入某个IDENTITY字段的当前会话值,而使用IDENT_CURRENT()会获得某个IDENTITY字段插入最大值,而不区分不同 会话。

    4K30

    XCode v8.11 重量级分分库(无视海量数据)

    XCode里面,分分库非常简单,操作数据(查询/更新)前修改Meta.ConnName/Meta.TableName,指向别的连接字符串和名,就实现了分分库功能!...实际,XCode实体层构建数据操作SQL(Select/Insert/Update/Delete)时,依赖于Meta.TableName,执行SQL时,依赖于Meta.ConnName。...新增加两个API是ProcessWithSplit和CreateSplit,前两个参数就是ConnName和TableName,意思是目标连接/名上进行数据库操作。...Insert User2之前,有一次根据Account查询,但是我们代码里面并没有这一次查询,怎么回事?...分分库,可以让我们根据业务需要(一般是时间),把不同数据分散不同数据库和不同数据中。 因此,XCode能够让你系统完全无视海量数据,完全无视性能!

    549100

    TSQL–标示列、GUID 、序列

    IDENTIY 列不能为空,不能设默认值,创建后不能使用ALTER TABLE TableName ALTER COLUMN修改,每张只能有一个自增列 –2....允许 显式 插入自增列:SET IDENTITY_INSERT TableName ON; 设置为ON后,允许当前回话对自增列插入时指定值,该设置只影响当前回话,并且同一回话中只允许同时修改一张IDENTITY_INSERT...属性,对其他再次设置时会提示:” ‘XXX1’ IDENTITY_INSERT 已经为 ON。...SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中任何内所生成最后一个标识值。...但是,SCOPE_IDENTITY返回插入到当前作用域中值;@@IDENTITY 不受限于特定作用域。@@IDENTITY能获取到由当前语句引发触发器,内置存储过程等倒置自增值。

    85220

    数据访问函数库源代码(二)—— SQL语句部分

    }         }         #endregion         ///          /// 运行SQl语句返回每一条记录一个字段数组...                             }         }         #endregion         ///          /// 运行SQl语句返回每一条记录一个字段数组...传入名,字段数组,值数组,返回新生成记录ID         ///          /// 要添加记录名称</param...传入名,字段数组,值数组 ,修改条件         ///          /// 要修改记录名称...传入名,FormTableCntrlInfo,返回新生成记录ID         ///          /// 要添加记录名称

    1.4K90

    Spring boot Mybatis-XML方式通用Mapper插件(七)

    ,需要用OGNL方式配置,不限制返回值,但是必须和字段类型匹配 IDENTITY:取回主键方式 DB2: VALUES IDENTITY_VAL_LOCAL() MYSQL: SELECT LAST_INSERT_ID...转换为小写 enableMethodAnnotation:可以控制是否支持方法JPA注解,默认false。...如果你实体类中包含了不是数据库字段,你需要给这个字段加上@Transient注解,这样通用Mapper处理单操作时就不会将标注属性当成表字段处理!...Integer id; 接口及使用大全 基础接口 Insert 1.InsertMapper 接口:InsertMapper 方法:int insert(T record); 说明:保存一个实体...根据实体中属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号 public TestUser selectOneTestUser() { TestUser

    3.5K10

    Entity Framework中使用存储过程(三):逻辑删除实现与自增长列值返回

    本篇文章通过实例方式,讨论两个EF使用存储过程主题:如何通过实体和存储过程映射实现逻辑删除;对于具有自增长类型主键数据进行添加操作时候如何将正确值反映在实体对象。...实际EF为你考虑到了这一点,你可以直接通过EF设计器设置这样一个筛选条件。...三、具有自增长列存储过程定义 接下来我们来讨论另一个常见场景:如果一个中存在一个自增长列作为该主键,当我们通过提交对应实体对象进行记录添加操作时,数据库中真正键值如何返回并赋值给该实体对象...NOT NULL 6: ) 如果你希望真正ID能够返回给被添加Contact对象,存储过程中完成添加操作后,应该通过SELECT语句将对应真实ID返回,这样存储过程应该这样来写:...Entity Framework中使用存储过程(三):逻辑删除实现与自增长列值返回 Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋Current值?

    1.7K80

    那些年我们写过T-SQL(下篇)

    ) 插入数据(有标识列情况下) 注意忽略标识列,INSERT INTO dbo.T1(datacol) VALUES('AAAAA') 获取当前标识号 SELECT SCOPE_IDENTITY(),...一致性(Consistency): 其是一个主观概念,取决于应用程序需求,指数据状态,与之后数据库隔离级别紧密关联。...SQL SERVER中,如果要获得某个资源类型锁,首先要获得起对应更高粒度级别上意向锁,例如获得一个行上排他锁,那么该事务需要获取行所在页意向排它锁和一个拥有该页对象意向排它锁,意向锁目的在于便于更高粒度级别有效检测不相容锁请求...实际上锁是需要消耗资源,因此需要在时间和空间折衷。默认情况下,系统首先获取细粒度锁,并在某些情况下,触发锁升级,例如一条语句中获取5000个行锁,那么将升级为页锁。...#MYTemp') IS NOT NULL CREATE TABLE #MYTemp(orderyear INT NOT NULL PRIMARY KEY) 全局临时 将本地临时#换成##即可

    2K50

    EDB分区一个“坑”

    实验过程: 目标:T1是主表,T2是子表,T2t1_id字段作为外键关联T1主键id字段。要验证就是是否可以主子表有关联数据情况下,直接删除T1数据。...t1" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION ) WITH (OIDS=FALSE) 但我们看其中一个分区T2_PART_01定义,却没有Foreign...此时返回报错,就是主外键约束问题了。...总结: 1.从EDB分区这个问题上,至少可以看出Oracle和EDB两种不同数据库处理分区区别,每个人都有他自己看法,怎么设计可能都有他考虑角度,可以说无所谓对错,只是易用性和接受性方面会有不同...3.都说实践是检验真理唯一标准,Oracle世界里,实践就是实验,纸上谈兵不能解决问题,实验过程中可能又会因为一个问题碰到另一个问题,也许这就是eygle一直所说”由点及面“学习方法,虽然有时会很痛苦

    70020

    39 | 自增主键不连续

    比如,双 M 主备结构里要求双写时候,我们就可能会设置成 auto_increment_increment=2,让一个自增 id 都是奇数,另一个自增 id 都是偶数,避免两个库生成主键发生冲突...values(null,2,2); //插入行是(3,2,2) 原因分析,为什么不能回退: 假设有两个并行执行事务,申请自增值时候,为了避免两个事务申请到相同自增 id,肯定要加锁,然后顺序申请...t2 values(null, 5,5); insert…select,实际 t2 中插入了 4 行数据。...之后,再执行 insert into t2 values(null, 5,5),实际插入数据就是(8,5,5)。 小结 MyISAM 引擎里面,自增值是被写在数据文件。...而在 InnoDB 中,自增值是被记录在内存。MySQL 直到 8.0 版本,才给 InnoDB 自增值加上了持久化能力,确保重启前后一个自增值不变。

    4.8K10

    MySQL锁概述

    而在Engine层却没有锁。 知道了怎么查询server和engine锁后,我们就可以开始我们实验了!...引擎,有一个IX 锁,也就是Intention Exclusive。...Server层也有一个SHARED_WRITRE。 在这个事务中,我们继续操作,查询另一个。 SELECT * FROM t1; 再次查询Innodb锁,发现没有任何变化。...然后DELETE,首先肯定是一个IX锁,声明下面有工人在干活了(删除记录),然后记录级别的话应该是有一个X,NOT GAP,因为我们是针对这个记录本身删除,应该会有一个X锁,不包括间隙。...这是因为,插入之前,5后面本来是200,本来就有空隙,是S,GAP锁,插入5之后,5之前肯定也要产生新间隙,那么就是从200继承过来S,GAP了。 那么5这条记录本身为什么没有任何锁呢?

    40930

    MySQL重大Bug!自增主键竟然不是连续递增

    比如,双M架构要求双写时,可能设置成auto_increment_increment=2,让一个自增id都是奇数,另一个自增id都是偶数,避免两个库生成主键发生冲突。...2,1,1),由于已存在c=1,所以报Duplicate key error 语句返回自增值已经改成3,是真正执行插入数据之前。...为什么默认设置下insert … select 偏偏要使用语句级锁?为什么该参数默认值不是2? 为了数据一致性。...id,会分配4个 依此类推,同一个语句去申请自增id,每次申请到自增id个数都是一次两倍。...之后,再执行 insert into t2 values(null, 5,5) 实际插入数据是(8,5,5)。这是主键自增id不连续三大原因。

    3.5K10

    MySQL重大Bug!自增主键竟然不是连续递增

    比如,双M架构要求双写时,可能设置成auto_increment_increment=2,让一个自增id都是奇数,另一个自增id都是偶数,避免两个库生成主键发生冲突。...(2,1,1),由于已存在c=1,所以报Duplicate key error 语句返回自增值已经改成3,是真正执行插入数据之前。...为什么默认设置下insert … select 偏偏要使用语句级锁?为什么该参数默认值不是2? 为了数据一致性。...id,会分配4个 依此类推,同一个语句去申请自增id,每次申请到自增id个数都是一次两倍。...之后,再执行 insert into t2 values(null, 5,5) 实际插入数据是(8,5,5)。这是主键自增id不连续三大原因。

    2.6K00

    MySQL实战第三十九讲-自增主键为什么不是连续

    对应执行流程如下图 2 所示,即insert(null, 1,1) 唯一键冲突: 可以看到,这个自增值改成 3,是真正执行插入数据操作之前。...c,d from t; insert into t2 values(null, 5,5); insert…select,实际 t2 中插入了 4 行数据。...之后,再执行 insert into t2 values(null, 5,5),实际插入数据就是(8,5,5)。 这是主键 id 出现自增 id 不连续第三种原因。 5....小结 今天,我们从“自增主键为什么会出现不连续值”这个问题开始,首先讨论了自增值存储。 MyISAM 引擎里面,自增值是被写在数据文件而在 InnoDB 中,自增值是被记录在内存。...然后,我和你分享了一个语句执行过程中,自增值改变时机,分析了为什么 MySQL 事务回滚时候不能回收自增 id。

    90410

    数据库面试题集合

    第三范式(3NF):第二范式基础,数据中如果不存在非关键字段对任一候选关键字段传递函数依赖则符合第三范式。...假设您SQL Server数据库里有ANSI_NULLS,当然默认情况下会有,对NULL这个值任何比较都会生产一个NULL值。...您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑希望获得一个答案。您必须使用IS NULL操作符。...外键限制用来维护引用完整性integrity。它被用来确保表格里字段只保存有已经不同(或者相同)表格里另一个字段里定义了值。这个字段就是候选键(通常是另外一个表格主键)。 ...(可以用作输出参数数据类型是有一些限制。)您可以一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。 ² 什么是相关子查询?如何使用这些查询?

    1.8K10

    MySQL命令,一篇文章替你全部搞定

    MyISAM,但由于数据存储在内存中,速度很快(特别适合于临时); 创建时候可以使用FOREIGN KEY来创建外键,即一个FOREIGN KEY指向另一个中PRIMARY KEY。...外键FOREIGN KEY用于约束破坏联结动作,保证两个数据完整性。同时也能防止非法数据插入外键列,因为该列值必须指向另一个主键。...(3)如果有NULL值,将值NULL作为一个分组进行返回,如果有多行NULL值,它们将分为一组 嵌套其他查询中查询,称之为子查询。...,需要知道以下两点: DELETE触发器代码内,可以引用一个名为OLD虚拟,来访问被删除行; OLD数据只能读,不能被更新,而在INSERT触发器中,就可以通过NEW来更新被插入行数据;...例如,针对customers,当删除一行数据时,返回被删除数据cust_id以及cust_name: 基本与创建INSERT触发器一样,只不过DELETE触发器中只能使用OLD来访问被删除行数据

    2.6K20
    领券