SQLSERVER标识列SQLSERVER 标识列
SQL Server中的标识列⼜称标识符列,习惯上⼜叫⾃增列。
该种列具有以下三种特点:
1、列的数据类型为不带⼩数的数值类型
2、在进⾏插⼊操作时,该列的值是由系统按⼀定规律⽣成,不允许空值
3、列值不重复,具有标识表中每⼀⾏的作⽤,每个表只能有⼀个标识列。
创建标识列
CREATE TABLE TB
(
ID INT NOT NULL PRIMARY KEY IDENTITY(1,1), --标识列
NAME VARCHAR(40)
)
添加标识列
CREATE TABLE TB2
(
NAME VARCHAR(100)
)
ALTER TABLE TB2
ADD ID INT IDENTITY(1,1)
查询标识
DBCC CHECKIDENT('TABLE_NAME', NORESEED)
常见问题⼀(⼿动添加)
--使⽤误区1:没有指明列后⾯的列名
--报错:仅当使⽤了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'TB'中的标识列指定显式值。 --错误:
SET IDENTITY_INSERT  TB ON
INSERT TB VALUES(1,'jack')
SET IDENTITY_INSERT  TB OFF
--误区2:在开启后,忘记关闭;
--最好成对出现,原因:A.任何时候,⼀个会话中只有⼀个表的 IDENTITY_INSERT 属性可以设置为 ON --,想修改其他表,必须将前⼀个ON状态改回OFF
--错误
SET IDENTITY_INSERT  TB ON
INSERT TB VALUES(1,'jack')
正确是写法:
--正确写法:
SET IDENTITY_INSERT  TB ON
INSERT TB(ID,NAME) VALUES(1,'jack')
SET IDENTITY_INSERT  TB OFF
重置标识列列
--当你⼿动插⼊之后:
SET IDENTITY_INSERT  TB ON
INSERT INTO TB(ID,NAME) VALUES(5,'5')
SET IDENTITY_INSERT  TB OFF
--那么下⼀条⾃增的数据将从 6开始
INSERT INTO TB(ID,NAME) VALUES('val')
/
*
1    JACK
5    5
6    val
*/
--那么⼜如何重置标识列呢?
--答案:使⽤DBCC CHECKIDENT('TABLE_NAME',RESEED,NEW_IDENTITY)
DBCC CHECKIDENT('TB',RESEED,1)
INSERT INTO TB VALUES('RESEED')
-- 结果:
/*
1    JACK
2  RESEED
5    5
6    val
*/
--问题⼜来了,如果⼀直隐式插⼊到4...回事什么结果呢;
INSERT INTO TB VALUES('3')
INSERT INTO TB VALUES('4')
--ID 为5 的数据已经存在了
INSERT INTO TB VALUES('5')
values什么意思--结果就是:
-
-违反了 PRIMARY KEY 约束 'PK__TB__3214EC274FD1D5C8'。不能在对象 'dbo.TB' 中插⼊重复键。
--插不进去呀;由于主键的约束嘛,不能重复;
--你可能会问:如果没有 primary key 呢?
--结果就是:可以插⼊,但是会出现重复,也就是两条 5 5(不信,你建⼀个表试试,反正我是试过了)
SQL Server 重置Identity标识列的值(INT爆了)
SQL Server数据库中表A中Id字段的定义是:[Id] [int] IDENTITY(1,1),随着数据的不断增长,Id值已经接近2147483647(int的取值范围为:-2 147 483 648 到 2 147 483 647)了,虽然已经对旧数据进⾏归档,但是这个表需要保留最近的1亿数据,有什么⽅法解决Id值就快爆的问题呢?
解决上⾯的问题有两个办法:
第⼀个是修改表结构,把Id的int数据类型修改为bigint
第⼆个是重置Id(Identity标识列)的值,使它重新增长。
这⾥,我再补充⼀点DBCC CHECKIDNET 的使⽤.
语法结构:
DBCC CHECKIDENT
( 'table_name'
[ , { NORESEED
| { RESEED [ , new_reseed_value ] }
}
]
)
使⽤DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 当前值设置为new_reseed_value,这个时候需要注意:new_reseed_value 的值应该取当前标识列中的最⼤值,避免插⼊错误。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。