`
javababy1
  • 浏览: 1202473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

标识列所用的计数值重置

阅读更多

标识列所用的计数值重置

                            flystone 整理

首先说两种可以重置种子的方法:

--
-- a:
TRUNCATE TABLE name
--新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。
/*
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。
但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。
新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。
如果要删除表定义及其数据,请使用 DROP TABLE 语句。

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。
由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

TRUNCATE TABLE 不能用于参与了索引视图的表。

*/
-- b:
DBCC CHECKIDENT (表, RESEED, 1)
/*

DBCC CHECKIDENT说明
DBCC CHECKIDENT ('table_name', NORESEED) 不重置当前标识值。DBCC CHECKIDENT 返回一个报表,它指明当前标识值和应有的标识值。

DBCC CHECKIDENT ('table_name')

或DBCC CHECKIDENT ('table_name', RESEED)

如果表的当前标识值小于列中存储的最大标识值,则使用标识列中的最大值对其进行重置。
DBCC CHECKIDENT ('table_name', RESEED,new_reseed_value) 当前值设置为 new_reseed_value。如果自创建表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入的第一行将使用new_reseed_value 作为标识。否则,下一个插入的行将使用 new_reseed_value + 1。如果 new_reseed_value 的值小于标识列中的最大值,以后引用该表时将产生 2627 号错误信息。


由此我想起上次有一个网友的问题能很好的让大家认识这个问题,

网友问题如下:

--有张表
Create table A(
A1 int identity(1,1) primary key,
A2 varchar(20),
A3 decimal(15,10)
)
--有个存储过程
Create proc deletes(@nA int)
as
begin tran
delete A where A1=@nA
if(@@Error=0)
Commit transaction
else
Rollback transaction
go
--当执行完
exec deletes 1
--以后
--我想让表里的所有记录A1从新从1开始排列,该怎么修改存储过程deletes,请高手指点

很显然在不利用SET IDENTITY_INSERT 开关项的前提下是无法在自增列完成这个功能的。

很自然的我们就引出这个SET IDENTITY_INSERT 开关项

SET IDENTITY_INSERT

允许将显式值插入表的标识列中。

语法

SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }

好下面我们就先利用这个开发项完成 这个网友的功能 

create table tb(id int identity(1,1),col char(1))
insert tb select 'a'
insert tb select 'b'
insert tb select 'c'
go
select * from tb
go
Create proc deletes(@nA int)
as
begin tran

SET IDENTITY_INSERT tb ON
delete from tb where id=@nA
if(@@Error=0)
begin
select * into # from tb where id >@nA
delete from tb where id > @na
insert tb(id,col) select id - 1 ,col from #
Commit transaction
drop table #
end
else
Rollback transaction
SET IDENTITY_INSERT tb OFF
go
exec deletes 2

select * from tb

drop proc deletes
drop table tb


结果一:

id col
----------- ----
1 a
2 b
3 c

结果二:

id col
----------- ----
1 a
2 c

(所影响的行数为 2 行)


到此以为完全实现这个网友的功能了,可是发现在调用exec deletes  2 删除第二记录后,

马上进行一条的记录的插入时发种子值仍是在原来的基础上增加了,比如我们一共三记录,删除第二条后经重新整理以为再插入时id 应该是3, 可是发现不对,测试删除重新整理后查看@@identity值仍是3,显然这是达到不预想的效果 的.

insert tb select 'd'
select * from tb

/*

id col
----------- ----
1 a
2 c

4 d -----显然这儿是不理想的,

*/

那怎么办呢,这个时我们想起前面讲的重置种子值的方法:dbcc CHECKIDENT,

哈哈,所以我们有了下面的比较完美的方法:

create table tb(id int identity(1,1),col char(1))
insert tb select 'a'
insert tb select 'b'
insert tb select 'c'
go
select * from tb
go
Create proc deletes(@nA int)
as
declare @i int
begin tran

SET IDENTITY_INSERT tb ON
delete from tb where id=@nA
if(@@Error=0)
begin
select * into # from tb where id >@nA
delete from tb where id > @na
insert tb(id,col) select id - 1 ,col from #
Commit transaction

drop table #
end
else
Rollback transaction

select @i = count(1) from tb
SET IDENTITY_INSERT tb OFF
DBCC CHECKIDENT ('tb',RESEED,@i)
go
exec deletes 2



select * from tb
insert tb select 'd' ---- add data again

select * from tb
select @@IDENTITY

insert tb select 'd'
select * from tb

/*

id col
----------- ----
1 a
2 c

3 d -----显然这儿是理想的结果,

*/

drop proc deletes
drop table tb

至此发现完全 满足这个朋友的预想目的。 


分享到:
评论

相关推荐

    标识列与普通列相互转换示例

    标识列与普通列相互转的示例 --创建测试表 CREATE TABLE t1(ID int IDENTITY,A int) GO --插入记录 INSERT t1 VALUES(1) GO --1. 将IDENTITY(标识)列变为普通列 ALTER TABLE t1 ADD ID_temp int GO UPDATE t1 SET ...

    DBCC CHECKIDENT 重置数据库标识列从某一数值开始

    DBCC CHECKIDENT 重置数据库标识列从某一数值开始 DBCC CHECKIDENT 命令是 SQL Server 中的一个数据库控制命令语言(DCL),用于重置数据库标识列的当前标识值。该命令可以指定新的标识值,并且可以根据需要重置...

    SQLServer-让标识列重新开始计算

    该命令可以用来查询或重置标识列的当前种子值和增量值。下面是对该命令语法的具体解释: ```sql DBCC CHECKIDENT ( { table | view } [ , { NORESEED | RESEED [ , seed ] } ] ) ``` - **table**:指定包含标识列...

    如何在数据库标识列里插入特定的值

    在数据库设计中,标识列(Identity Column)通常用于自动生成唯一的序列值,作为表的主键,确保数据的唯一性和完整性。然而,在某些情况下,可能需要在标识列中插入特定的值,例如填补因错误删除导致的空缺或保持...

    SQL Server修改标识列方法 如自增列的批量化修改

    代码如下: –允许对系统表进行更新 exec sp_configure ‘allow updates’,1 reconfigure with override GO –取消标识列标记 update syscolumns set colstat = 0 where id = object_id(‘tablename’) and colstat ...

    如何在数据库的标识列里插入特定的值

    尽管你可以对标识列(identity column)的值及其任意值的用处有千条万条理由,但是和你共同工作的一些人会坚持在给定的表格里使用连续的主关键字(PK)。为了解决这个问题,你可以创建一个带有标识列的表格,并用...

    Insert语句向标识列中插入数据.pdf

    在SQL语言中,标识列(Identity Column)是一种特殊类型的列,通常用于自动为表中的每一行生成唯一的序列号。在大多数情况下,标识列的值是由数据库系统自动管理和更新的,而不是由用户直接插入。然而,有时我们需要...

    Sql修改标示列的方法

    然而,在某些情况下,可能需要手动修改标识列的行为,例如更改其起始值、重置序列或者调整其属性等。下面将详细介绍几种常见的SQL修改标识列的方法。 #### 1. 允许对系统表进行更新 在Microsoft SQL Server中,...

    MDB数据库自动编号

    在使用MDB(Microsoft Access)数据库的过程中,有时候我们需要为表中的某列设置自动编号功能,这样可以方便地为每条记录自动生成唯一的标识符(ID)。例如,在创建一个包含用户评论的数据库时,为了能够唯一标识每...

    数据库数据删除工具

    删除数据库数据,包括删除,清除功能,二者均删除表中的全部行,"清楚"数据删除表中的所有行,但表结构及其列、约束、索引等保持不变.新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 "删除

    SQL SERVER中自动标识列的改进.pdf

    "SQL SERVER中自动标识列的改进" 本文讨论了SQL SERVER中自动标识列的两大限制:一是初始值只能是整型的数据,无法使用文本型数据或包含前导零的文本型数据;二是删除表中的记录或删除记录后再插入记录将导致表中的...

    sqlsever为标识列指定显式值

    在SQL Server中,标识列是一种特殊的自动递增列,通常用于主键,它会在每次插入新行时自动为该列生成唯一的数值。然而,有些情况下,我们可能需要为标识列指定一个具体的显式值,例如在数据迁移或者复制数据到具有...

    SQL Server手工插入标识列的方法

    如果我们在标识列中插入值,例如: 代码如下:insert member(id,username) values(10,’admin’) 则在查询分析器里面会返回错误信息: [plain] 引用内容 服务器: 消息 544,级别 16,状态 1,行 1 当 IDENTITY_...

    winform中获取gridview选定行标识列的值

    在探讨如何在WinForm应用程序中获取GridView控件中选定行的标识列的值之前,我们需要先了解几个关键概念:WinForm、GridView控件以及相关的编程技术。本篇内容将围绕这些核心点展开,并提供详细的解释与示例代码。 ...

    十、关于MySQL 标识列,你该了解这些!

    3、标识列的类型只能是数值型 4、标识列可以通过 SET auto_increment_increment=3;设置步长 可以通过 手动插入值,设置起始值 一、创建表时设置标识列 DROP TABLE IF EXISTS tab_identity; CREATE TABLE tab_...

    《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·004【标识列、外键、复制表】

    标识列,又称为自增列,可以不手动插入数值,系统提供默认的序列值。 特点 标识列必须和一个key搭配(key:主键、唯一键、外键、……) 一个表最多只有一个标识列 标识列的类型只能是数值类型 设置标识列(举例) 创...

    sql server获得新记录标识列值的二种方法

    对新添加的记录,获得新记录的自动标识列的值,有两种方式:1.在INSERT中使用OUTPUT关键字INSERT INTO table_name(column1,column2,column3)OUTPUT INSERTED.ID –返回自动增长的标识列的值VALUES(”,”,”)–ADO...

Global site tag (gtag.js) - Google Analytics