您的位置:首页 > 数据库

SQLSERVER 标识列

2015-09-25 17:27 399 查看
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 的值应该取当前标识列中的最大值,避免插入错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: