identity自动标识列

语法:identity(seed , increment),

说明:seed 表示种子值,increment表示增量值. 它是一个自动生成标识的值的函数,返回值类型为整型。标识列的值不可以手动修改,要手动给标识列插入值需要先设置 set identity_insert table_name on 打开标识插入选项。标识列的值可重复,要想确保标识列的唯一,需要给列添加约束:唯一或者主键.

查看最新标识值的三个函数:@@identity,scope_identity(),current_ident('table_name');

@@identity:可以跨作用域当前会话的最后一个标识值。

scope_identity():当前会话当前作用域的最新标识值。

ident_current('table_name'):查询指定表的最新标识值,与会话和作用域无关。

注意:这里的作用域(scope)是指一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中

示例代码:

CREATE SCHEMA LTH
GO
IF OBJECT_ID('LTH.t6','U') IS NOT NULL
	DROP TABLE LTH.t6
IF OBJECT_ID('LTH.t7','U') IS NOT NULL
	DROP TABLE LTH.t7;
GO
CREATE TABLE LTH.t6(id INT identity(1,1));
CREATE TABLE LTH.t7(id INT identity(100,1));
GO
--创建触发器
CREATE TRIGGER LTH.t6ins ON LTH.t6 FOR INSERT
AS
BEGIN
	INSERT LTH.t7 DEFAULT VALUES;
END
--触发器结束
GO
INSERT INTO LTH.t6 DEFAULT VALUES;--t6插入默认值会引发触发器LTH.t6ins插入值至t7

SELECT @@IDENTITY;---RETURN 100
SELECT SCOPE_IDENTITY();--return 1
SELECT IDENT_CURRENT('LTH.t6');--return 1
SELECT IDENT_CURRENT('LTH.t7');--return 100

说明:当前会话中,@@identity 返回100,scop_identity() 返回1 。两者返回值不一样。先从insert 执行的方式开始,执行插入t6表数据然后是引发t6表上的触发器,执行插入数据至t7表。这里体现了作用域的问题,SCOPE_IDENTITY()获取的是当前作用域insert t6表,@@identity可以跨作用域取的是最后一个insert t7表。ident_current('tb_name)与作用域会话无关.

重新建立一个会话2,输入标识查询函数:

SELECT @@IDENTITY;---RETURN null
SELECT SCOPE_IDENTITY();--return null
SELECT IDENT_CURRENT('LTH.t6');--return 1
SELECT IDENT_CURRENT('LTH.t7');--return 100

说明:@@IDENTITY与SCOPE_IDENTITY() 仅用于当前会话,另新开一个会话不能获取原来的标识值,所以返回NULL。而IDENT_CURRENT('tb_name') 与作用域和会话无关,可以查询出表中最新的标示值。

猜你喜欢

转载自blog.csdn.net/ilovetheworld/article/details/88837218