SQL Server的Identity字段使用/复制/重设

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

SQL Server的Identity字段使用/复制/重设

在数据库中, 常用的一个流水编号通常会使用 identity 字段来进行设置, 这种编号的好处是一定不会重复, 而且一定是唯一的, 这对table中的唯一值特性很重要, 通常用来做客户编号, 订单编号等功能, 以下介绍关于此种字段常用方式及相关技术. 

后面的范例表皆以此表为建立: 
CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40)) 
more.. 
less.. 
1. 在程序中取得identity值: 
因为 identity 特性, 所以在 insert into 该 table 时, 不能指定该 identity 字段值, 仅能指定其它字段值, 而 identity 由数据库维护, 所以一般要在 insert 后取得该 identity 字段值, 则通常使用下面方式: 
insert into products (product) values ('saw') 
select @@identity 
利用全域变量 @@identity 来取得最后影响的 insert 后产生的 identity 值, 如此一来便能方便地使用 identity 字段. 

2. 若要启用识别插入(identity insert)时, 也就是如空缺号要指定 identity 字段值时, 或者是处理数据表整理或备出时, 会用到的方式: 
set identity_insert products on 
insert into products (id, product) value (3, 'screwdriver') 
要注意的地方是可以 insert 空缺号, 也可以加至最后, 但系统会自动更新 identity 至最大值, 要注意一旦启用 identity_insert 时, 就一定要给定 identity 值, 另外并不能 update 该 identity 字段值, 也就是说 identity_insert 该 identity 字段仅 for insert, 不能 update. 

3. 查询目前 identity 值: 
有时我们需要查询目前 table 中该 identity 字段最大值是多少时, 可以利用 dbcc 指令, 如下: 
dbcc checkident('product', NORESEED) 
可以获得目前最大值的结果. 

4. 重设目前最大 identity 值: 
一样利用 dbcc 指令, 如下: 
dbcc checkident('product', RESEED, 100) 
如此一来, 便能将目前的最大 identity 值指向100, 当然若故意设比目前最大值小时, 系统仍会接受, 但若 identity 遇上重复数据时(如将 identity 设为 primary key时), 将会发生重大问题, 该 table 变成无法 insert 数据, 因为会发生 primary key violation, 解决方法当然就是将目前的 identity 修复, 直接使用 
dbcc checkident('product', RESEED) 或 
dbcc checkident('product') 
(两者等义)即可顺利修复. 

5. identity 字段遇上 rollback 时: 
当 identity 字段碰到 rollback 时, 会发生跳号现象, 也就是说在 transaction 中, insert 了一笔数据, 但又 rollback 时, 该 identity 号会消失, 如下测试: 
begin tran 
insert into products (product) values ('test rollback') 
rollback tran 
dbcc checkident('product', NORESEED) 
这个观念很重要, 因为要维持 identity 特性, 但又发生 rollback, 所以系统就直接跳号处理啰, 避免发生重复编号的问题. 

identity 字段是一项很重功的功能, 若能善加利用, 相信帮助很大. 
所有的数据皆可在 sql server help 内找到, 也请多加利用.

本文转自holy2009 51CTO博客,原文链接:http://blog.51cto.com/holy2010/354913
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 存储 数据库
SQL部分字段编码设置技巧与方法
在SQL数据库管理中,设置字段的编码对于确保数据的正确存储和检索至关重要
|
1月前
|
SQL 存储 Serverless
SQL语句拆分时间字段的技巧与方法
在数据库操作中,经常需要处理时间数据
|
1月前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
1月前
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
|
1月前
sqlserver实现取相同名称放在同一字段
sqlserver实现取相同名称放在同一字段
29 2
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
180 0
|
3月前
|
SQL Java 数据库连接
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
|
3月前
|
SQL Oracle 关系型数据库
SQL添加字段记录详解:技巧与方法实践
在数据库管理中,经常需要向表中添加新的字段(列)或向现有字段中插入新的记录(行)
1232 0
|
3月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
496 0
下一篇
无影云桌面