ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

无法于 SQL Database 利用 DBCC CHECKIDENT 重新设定识别值时的替代作法

2019-09-12 09:51:29  阅读:359  来源: 互联网

标签:值时 Table1 CHECKIDENT Database SQL DBCC ID


本文将介绍当您无法于 SQL Database 利用 DBCC CHECKIDENT 重新设定识别值时的替代作法。


情境说明

在论坛上有朋友讨论到 SQL Database 不支持使用 DBCC CHECKIDENT 来重设识别值,是否有其他替代方案?在 SQL Azure 官方论坛上看到有国外的朋友提出变通的作法以及小朱版主提到砍掉数据表重建的方式有异曲同工之妙,笔者将之实践步骤整理如下,在此跟大家分享。

前置作业

首先笔者在 SQL Database 管理入口网站利用网站提供的设计工具来建立一个测试数据表(Table1),包含 ID、c1 和 c2 等三个字段,其中 ID 为 identity。

image

接着点选【New Query】,接着输入下列的 T-SQL 后按【Run】来新增测试数据。

   1: INSERT INTO Table1(c1,c2) VALUES ('a','aa'),('b','bb'),('c','cc')


执行结果如下:

image

若您尝试在 SQL Database 上执行 DBCC CHECKIDENT 命令,将会发生【DBCC command 'CHECKIDENT' is not supported in this version of SQL Server.】的错误消息。

image

解决方式

假设您利用 T-SQL 删除 ID 大于 1 的数据只留一笔数据,若后续再利用 INSERT 叙述来新增数据时,依照识别字段的特性,除非利用 DBCC CHECKIDENT 来重设识别值,否则 ID 会从 4 开始累加。但由于 SQL Database 不支持 DBCC CHECKIDENT,若您想要让识别值从 2 开始,您可以利用下列T-SQL 来达到相同目的:

   1: --故意删除ID大于1的数据
   2: DELETE Table1 WHERE id > 1
   3: GO
   4:  
   5:  
   6: --STEP 1、建立临时数据表
   7: IF OBJECT_ID('dbo.Table1_temp') IS NOT NULL
   8:     DROP TABLE Table1_temp
   9: GO
  10:  
  11: CREATE TABLE Table1_temp (id int identity primary key,c1 nvarchar(50),c2 nvarchar(15))
  12:  
  13: --STEP 2、允许将明确的值插入数据表的识别字段中
  14: SET  IDENTITY_INSERT TestDB.dbo.Table1_temp ON
  15:  
  16: --STEP 3、插入数据到临时数据表
  17: INSERT INTO Table1_temp(ID,c1,c2)
  18: SELECT * FROM Table1
  19:  
  20: --STEP 4、关闭允许将明确的值插入数据表的识别字段中
  21: SET  IDENTITY_INSERT TestDB.dbo.Table1_temp OFF
  22: GO
  23:  
  24: --STEP 5、删除原始数据表
  25: DROP TABLE Table1
  26:  
  27: --STEP 6、将临时数据表改为原始数据表
  28: EXEC dbo.sp_rename @objname = N'[dbo].[Table1_temp]', @newname = N'Table1', @objtype = N'OBJECT'
  29:  
  30: --STEP 7、插入数据
  31: INSERT INTO Table1(c1,c2) VALUES ('b','bb'),('c','cc')
  32:  
  33: SELECT * 
  34: FROM Table1


实际画面如下:

image

当执行完毕之后您将看到新增的数据可以从 ID 等于 2 开始插入,而不是从 4 开始,用到的概念是先建立一个和原始数据表(Table1)结构相同的临时表,接着利用 SET IDENTITY_INSERT ON 选向来开启可以插入识别字段的值,就可以达到类似重新设定识别值的效果(执行结果如下)。

image

参考数据

- DBCC CHECKIDENT (Transact-SQL)

- SQL AZURE - Identity Reseed

原文:大专栏  无法于 SQL Database 利用 DBCC CHECKIDENT 重新设定识别值时的替代作法


标签:值时,Table1,CHECKIDENT,Database,SQL,DBCC,ID
来源: https://www.cnblogs.com/petewell/p/11510289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有