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

  • 相关阅读:
    Mysql热备份
    win10 上安装虚拟机
    SpringMVC AJAX向后台传递数组参数/实体集合
    解决eclipse中tomcat不加载web项目的问题
    Python 基础第九天
    Python 基础第8天(文件管理)
    Python 基础第七天
    Python 基础第六天
    Python 基础第五天
    Python 基础第四天
  • 原文地址:https://www.cnblogs.com/mc67/p/4838878.html
Copyright © 2011-2022 走看看