sql server里获取向数据库插入数据后返回新插入行的主键

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34332010/article/details/52723474

往数据库插入一组新元组后该任何获取插入元组的主键?
要求:所要插入的表里要有标识列.

***什么是标识列?***
通俗点来讲就是主键会自动编号,在插入数据时,会自增,无需人为干预,其数据类型为不带小数的数值类型,
主要包括decimal、int、numeric、smallint、bigint 、tinyint

如果一个表里没有标志列,执行如下查询操作时

select @@IDENTITY as res;
select scope_identity() as res;

查询出来的结果一直会NULL
如果没有标识列,可以通过一下语句添加
假设有一张test表

alter table test
add id int identity (1,1) --标识列,种子为1,递增量为1

种子(seed)
是指派给表中第一行的值,默认为1

递增量(increment)
相邻两个标识值之间的增量,默认为1,即每次执行插入数据时,元组id都加1。

***下面新建一张表来演示***
create table test
(
    Id int identity(0,1) primary key ,
    val nvarchar(50),
);

insert into test(val)
values('11')

select @@IDENTITY as res
select scope_identity() as res;
--drop table test;

结果如下:
这里写图片描述

这里写图片描述

除了可以查询新插入的标识,也可以查询其它元组里的其它属性,下面就是查询插入的val属性
insert into test(val)
values('11')

select val 
from test
where @@ROWCOUNT > 0 and id= scope_identity()

通过@@identity和SCOPE_IDENTITY( )我们取得了刚插入表中的最后一个元组id

***现在再来谈一下**@@identity**和**SCOPE_IDENTITY( )*****


  SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。
  但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如
有两个表 table1 和 table2,并且在 table1 上定义了 insert 触发器。
当将某行插入 table1 时,触发器被激发,并在 table2 中插入一行。
该方案演示了两个作用域:在table1 上的插入,以及在 table2通过触发器的插入。

假设 table1 和 table2 都有标识列

select @@IDENTITY as res
select scope_identity() as res;

上面两条语句在table1上的insert 语句执行后可能返回不同的值。
@@IDENTITY 返回的是因触发器插入到table2中最后一个标识列的值。
SCOPE_IDENTITY() 返回的是在table1中插入的 IDENTITY 值。

另外,如果在任何insert 语句作用于作用域中的标识列之前调用 SCOPE_IDENTITY() 函数,则该函数将返回空值。

展开阅读全文

没有更多推荐了,返回首页