无意间放入发现,觉得很有用,先记录下来
实现在删除数据后,自增列的值连续其处理思路如下:
在删除自增列所在表的记录时,将删除行的自增列的值保存在另外一个表,以便下次新增数据时,使用原来被删除的自增列的值。
实现步骤:
创建两个表test_id(自增列所在表),test_r(记录被删除的自增列其值)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test_id]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test_id]
GO
CREATE TABLE [dbo].[test_id] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test_r]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test_r]
GO
CREATE TABLE [dbo].[test_r] (
[r_id] [int] NULL
) ON [PRIMARY]
GO
在删除test_id 的记录时,将起响应id保存到test_r表,通过test_id 表的delete触发器实现
CREATE TRIGGER dt_test_id ON [dbo].[test_id]
FOR DELETE
AS
begin
declare @row int
set @row=0
if exists(select * from deleted )
begin
insert into test_r(r_id) select id from deleted
end
end
向表test_id插入数据时,判断其id是否存在与test_r表中,如存在则删除id在test_r值,通过test_id的插入触发器实现:
CREATE TRIGGER it_test_id ON [dbo].[test_id]
FOR INSERT
AS
begin
if @@rowcount=0 return
declare @row int
set @row=0
if exists(select * from inserted )
begin
delete from test_r where exists(select id from inserted where test_r.r_id=inserted.id )
end
end
在插入前需判断test_r表是否存在被删除的id ,若存在,则使用其test_r表中的记录作为插入行id栏位的值
如没有,则直接插入。通过test_id表的插入前触发器实现:
CREATE trigger iit_test_id on test_id
instead of insert
as
begin
declare @min_id int
declare @id int
declare @rowcount int
declare @rowcount_i int
declare @name varchar(20)
declare @sql varchar(8000)
create table #t(id int identity(1,1) ,name varchar(20) null,tag varchar(1) null)
insert into #t(name,tag) select name,'0' from inserted
--如果存在断号,取已经存在的断号。
if exists(select * from test_r)
begin
-- 可以显示插入自增列。
SET IDENTITY_INSERT test_id on
--获取可用断号记录
select @rowcount=count(*) from test_r
--获取插入行的记录。
select @rowcount_i=count(*) from inserted
--当断号记录的数量大于插入数据的行数时,则所有的插入记录的 id均使用断号,故返回inserted 表中的所有行
--当断号记录的数量小于插入数据的行数时,则所有的插入记录前的(断号记录总行数)行id均使用断号,故返回inserted 表中前(断号记录总行数)的行
if @rowcount > @rowcount_i
set @rowcount=@rowcount_i
set @sql=''
set @sql='declare cur_get cursor for select top '+cast(@rowcount as varchar(20))+' id,name from #t order by id '
exec(@sql)
open cur_get
fetch cur_get into @id, @name
while @@fetch_status=0
begin
select @min_id =min(r_id) from test_r
if exists( select min(r_id) from test_r)
begin
update #t set tag='1' where id=@id
end
insert into test_id(id,name)values(@min_id,@name)
fetch cur_get into @id,@name
end
close cur_get
deallocate cur_Get
SET IDENTITY_INSERT test_id off
--当断号记录的数量小于插入数据的行数时,使用断号记录的剩余行则不需要显示id插入
if exists(select * from #t where tag='0')
begin
insert into test_id(name) select name from #t where tag='0'
end
drop table #t
end
else
-- 不存在断号就直接插入。
insert into test_id(name )select name from inserted
end
分享到:
相关推荐
如果非要在SQL Server 平台修改自增列值的,那就手动需要自增列属性,然后修改该列值,修改成功后再手动添加自增列属性。如果在生成环境修改自增列的话,建议在空闲时间(零点以后,平台或网站使用的用户很少的时间...
SQL Server 中数据表往往会设置自增列,常见的比如说 首列的ID列。 往数据表插入新数据的时候,自增列是跳过的,无需插入即会按照设置的自增规则进行列增长。那么,如果我们想往自增列插入我们指定的数据时该怎么做...
插入数据时获取自增ID,使用序列,需要在插入数据时,自增字段插入序列下一个值
数据库自增列主键在数据库还原时百分百会出问题 为解决该问题特开发自定义式的主键 创建一个监控表,一个被调用的存储过程即可,推荐有存储过程编广泛使用的程序使用 调用方法 DECLARE @PKID CHAR(12)='' EXEC [dbo]....
oracle创建自增列.txtoracle创建自增列.txtoracle创建自增列.txtoracle创建自增列.txtoracle创建自增列.txtoracle创建自增列.txt
在网上找的资料,oracle建表以后如何建自增序列和触发器。觉得比较实用,分享出来
主要介绍了重置MySQL中表中自增列的初始值的实现方法的相关资料,需要的朋友可以参考下
常用数据库的自增字段创建方法汇总常用数据库的自增字段创建方法汇总
在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL的自增列插入0值。在MSSQL中是这样完成的: 代码如下: string sql;sql = ” set identity_insert dbo.AppUsers on ” + ” insert dbo....
通过C#调用CMD.exe,利用MySQL提供的数据库访问接口实现为表添加新的一列数据并给定默认值
重置 MySQL 自增列 AUTO_INCREMENT 初时值 注意, 使用以下任意方法都会将现有数据删除. 方法一: delete from tb1; ALTER TABLE tbl AUTO_INCREMENT = 100; (好处, 可以设置 AUTO_INCREMENT 为任意值开始) 提示:...
判断Table是否存在自增列(Identity column)
在做《机房收费系统》的时候,有的表需要添加自增列,在添加新纪录时自动添加一个序号。下面我给大家介绍两种添加方法: 一、通过T-SQL代码. 代码如下: alter table 表名 add 列名 int IDENTITY(1,1) NOT NULL 这里...
python实现矢量数据自增编码,方便数据处理。为广大的gis人员提供快捷高效的数据处理模式。希望弄够多加指教共同学习共同进步。
oracle中如何实现ID自增,我以前也不会最近才会的,想把它分享给大家。
AddRowControls(Table数据表自增行的案例)