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 的值应该取当前标识列中的最大值,避免插入错误。