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') --结果就是: --违反了 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 的值应该取当前标识列中的最大值,避免插入错误。