参考:深入了解identity

参考:深入了解计算列

概念:标识值 identity(begin,add_number) 是一种特殊的值,依赖于列,由sql server自动维护,是自增的,而且一般是不会重复的。但是sql server并不维护标识(identity)值的唯一(要保证其唯一需在使用列上添加主键或唯一约束),也不维护标识值的连续。

0、查看表是否有标识列

  1. select * from db_tank.sys.columns
  2. where object_id=object_id('sys_users_detail')
  3. AND is_identity=1

1、标识值不连续

(1)当事务回滚的时候

  1. --构建测试表
  2. create table test_1(id int identity(1,1) ,col int)
  3. GO
  4. --构建测试数据
  5. insert into test_1(col) values(101),(102),(103)
  6. --事务回滚
  7. begin tran a
  8. insert into test_1(col) values(104),(105),(106)
  9. rollback tran a
  10. --再次插入
  11. insert into test_1(col) values(107),(108),(109)
  12. --验证
  13. select * from test_1
  14.  
  15. 结果如下:

  

(2)删除记录

    无论被删除的标识值是最新添加的还是以前添加的,标识值均不会再回收利用,这里就不演示了。

(3)使用dbcc checkident重置标识值

  1. --现有数据
  2. select * from test_1
  3. --重置标识值
  4. dbcc checkident(test_1,reseed,1)
  5. --插入测试数据
  6. insert into test_1(col) values(110),(111),(112)
  7. --验证标识值
  8. select * from test_1
  9.  
  10. 结果如下:
  11.  
  12. 现有数据~              验证标识值数据

         

2、identity强行插入

  由于sql server不维护标识值的唯一,因此在没有主键、唯一约束等情况下,标识值可能会重复。

(1)使用 set identity_insert tableNmae on 强行插入标识值 (注意,用这种办法插入时,一定要写列名 而不是*)

    

(2)使用dbcc checkident重置标识~~1的(3)中已经描述过操作,这里不再赘述

3、在select into 中构造identity列

select 1 as id,2 as num,identity(int,1,1) rn into #temp1

  

4、删除列的identity属性

  1. --如何用sql语句去掉列的自增长(identity)
  2.  
  3. --**无法通过alter把现有自增字段改为非自增
  4. --比如alter table a alter id int,自增属性不会去掉
  5. --通过修改系统表可以做到(此法可能有不可预知的结果,慎之...)
  6.  
  7. sp_configure 'allow updates ', 1
  8. GO
  9. reconfigure with override
  10. GO
  11. update syscolumns set colstat = colstat & 0x0000
  12. where id=object_id( '表名 ') and name= '字段名 '
  13. GO
  14. sp_configure 'allow updates ', 0
  15.  
  16. ---------------------------------------------
  17. --折中的办法
  18. alter table a add xxx int
  19. update a set xxx=id
  20. alter table a drop column id
  21. exec sp_rename 'xxx ', 'id ', 'column '

5、计算列

  

  1. CREATE TABLE #t
  2. (
  3. x INT ,
  4. y INT ,
  5. z AS x+y
  6. )
  7.  
  8. INSERT INTO #T VALUES(,);
  9. INSERT INTO #T VALUES(,);
  10. INSERT INTO #T VALUES(,);
  11. INSERT INTO #T VALUES(,);
  12. INSERT INTO #T VALUES(,);
  13.  
  14. SELECT * FROM #T
  15.  
  16. DROP TABLE #t
  17.  

来一个比较实际的需求:弄一个日期加两位数流水号的自动编号

CREATE TABLE #t
(
id INT IDENTITY(1,1) ,
aa DATETIME DEFAULT GETDATE(),
new_id AS CONVERT(VARCHAR(20),GETDATE(),112)+'_'+RIGHT('0000000'+CAST(id AS VARCHAR(200)),3),
x INT
)

INSERT INTO #t (X) VALUES(1);
INSERT INTO #t (X) VALUES(1);
INSERT INTO #t (X) VALUES(1);
INSERT INTO #t (X) VALUES(1);

SELECT * FROM #T

DROP TABLE #T

  

  1.  

(3.9)常用知识-标识值(identity)的不连续与强行插入、计算列的更多相关文章

  1. <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY

    MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...

  2. sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别

    原文:sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别 IDENT_CURRENT 返回为任何会话和任何作用域中的指定表 ...

  3. Shell【常用知识总结】

    一.常用知识总结 1.特殊变量($0,@,#,*,?) $0:当前脚本的文件名. $n:n是一个数字,表示第几个参数. $#:传递给脚本或函数的参数个数. $*:传递给脚本或函数的所有参数.当被双引号 ...

  4. SQLSERVER:大容量导入数据时保留标识值 (SQL Server)

    从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...

  5. javascript常用知识点集

    javascript常用知识点集 目录结构 一.jquery源码中常见知识点 二.javascript中原型链常见的知识点 三.常用的方法集知识点 一.jquery源码中常见的知识点 1.string ...

  6. Python数据分析与挖掘所需的Pandas常用知识

    Python数据分析与挖掘所需的Pandas常用知识 前言Pandas基于两种数据类型:series与dataframe.一个series是一个一维的数据类型,其中每一个元素都有一个标签.series ...

  7. Oracle常用知识小总结

    永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! Oracle常用知识小总结 1. 创建自增主键 对于习惯了SQL SERVER的图形化界面操作的SQLer,很长一段时间不用oracle ...

  8. php常用知识集锦

    php常用知识集锦 很多位置都有写好的代码,自己做项目的时候可以直接拿来用,而不用自己写,比如现在看到的菜鸟教程. 1.判断是否为空 empty($_POST["name"]) 2 ...

  9. javascript常用知识汇总

    javascript这个语言庞大而复杂,我用了三年多了,还是皮毛都不会.从刚开始的jquery,到后来的es6,每天都在学习,每天都在忘记. 1.禁止手机虚拟键盘弹出 在开发适配手机的页面时,出现了这 ...

随机推荐

  1. [i.MX6q]i.MX6q处理器,linux操作系统平台搭建 从SD卡启动系统

    转自:http://www.07net01.com/linux/2016/02/1232094.html 参照1:http://blog.csdn.net/girlkoo/article/detail ...

  2. 关于js中__proto__和prototype的一些理解<转>

    var Person = function(name) {     this.name = name; } var p = new Person(); new操作符的操作是 var p = {} p. ...

  3. Android——Activity生命周期(转)

    Activity生命周期   子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细 ...

  4. [Java] 一种好的JAVA分页实现

    喃都不说了,贴代码,意思都在代码里面了 Page.java //分页类.定义分页字段信息,供前台页面使用 package com.core.common; import java.util.List; ...

  5. WebService的初级学习

    复习准备 1. Schema约束: 1.1   namespace相当于Schema文件的id: 1.2   targetNamespace属性用来指定schema文件的namespace的值; 1. ...

  6. 在CentOS上安装Java环境

    如何使用yum方式在CentOS上安装Java环境,系统以CentOS6.4为例. 工具/原料 Java JDK yum库 CentOS6.4 方法/步骤 1 查看CentOS自带JDK是否已安装. ...

  7. 移动ChemDraw结构有什么方法

    ChemDraw软件是一款比较常见的化学绘图软件,化学专业的领域的人常常会用到它.本教程主要是针对新手用户,让其了解一些ChemDraw的一些基本操作,以便其能尽快上手早日用到工作中.下面我们就来给大 ...

  8. Ubantu apt source 国内

    位置 /etc/apt/sources.list apt-get update deb http://mirrors.163.com/ubuntu/ precise main restricted u ...

  9. jquery做简单特效

    1.点击触发消失效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  10. vue-router scrollBehavior无效的问题

    在使用vue做单页面应用开发时候 使用vue-router作为路由控制器  在使用过程中发现每个页面打开都在原来的位置 不能返回到页面顶部位置 ,然后查看api文档 滚动行为  发现如下代码: con ...