出200分,问一个SQL语句!!!!!

hackerning 2001-09-24 11:19:02
我建立了一个有一个字段自动从1增加的INT类型字段,也就是用了IDENTITY

但是问题是当我删除其中的一个字段后这些自动排序地增的字段不会变,

有什么SQL语句在删除一个字段后能让删除字段后的字段自动更新减一,保持一致的???????
...全文
238 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiaoCheng 2001-10-22
  • 打赏
  • 举报
回复
这种ID有什么意思,还是改变一种方式吧,或是从另外一个角度考虑,也许会有更好的效果
icevi 2001-10-22
  • 打赏
  • 举报
回复
有必要吗?为了个没意义的ID号?
foolishchao 2001-10-22
  • 打赏
  • 举报
回复

下面的方法在MsSql7中通过测试。
用另一个表保存最大ID,ID由 trigger 维护,后台操作。
通过锁定studentmaxid,每个时刻只有一个写操作在执行。

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tr_student_insert]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].[tr_student_insert]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tr_student_delete]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].[tr_student_delete]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[student]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[student]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[studentmaxid]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[studentmaxid]
GO

CREATE TABLE [dbo].[student] (
[id] [int] NULL ,
[name] [char] (10) NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[studentmaxid] (
[id] [int] NOT NULL ,
[dates] [datetime] NOT NULL
) ON [PRIMARY]
GO

CREATE UNIQUE INDEX [name] ON [dbo].[student]([name]) ON [PRIMARY]
GO

CREATE INDEX [id] ON [dbo].[student]([id]) ON [PRIMARY]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


CREATE TRIGGER dbo.tr_student_insert ON [dbo].[student]
FOR INSERT
AS
set nocount on
declare @cnt int
select @cnt=count(*) from inserted
if @cnt=0
return

begin tran

declare @name char(10),@id int
--锁定 studentmaxid
update studentmaxid set dates=getdate()
--取出id
select @id=id from studentmaxid
if @id is null
begin
rollback tran
raiserror('System data is missing',16,1)
return
end

declare cr_student_insert cursor local for select name From Inserted
open cr_student_insert
fetch next from cr_student_insert into @name
set
while @@fetch_status=0
begin
set @id=@id+1
update student set id=@id where name=@name
fetch next from cr_student_insert into @name
end
close cr_student_insert
deallocate cr_student_insert
update studentmaxid set id=@id,dates=getdate()

commit tran




GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


CREATE TRIGGER dbo.tr_student_delete ON [dbo].[student]
FOR DELETE
AS
set nocount on
declare @cnt int
select @cnt=count(*) from deleted
if @cnt=0
return
begin tran
declare @id int
--锁定 studentmaxid
update studentmaxid set dates=getdate()
select @id=id from studentmaxid
if @id is null
begin
rollback tran
raiserror('System data is missing',16,1)
return
end

declare cr_student_deleted cursor local for select id From deleted order by 1 desc
open cr_student_deleted
fetch next from cr_student_deleted into @id
while @@fetch_status=0
begin
update student set id=id-1 where id>@id
fetch next from cr_student_deleted into @id
end
close cr_student_deleted
deallocate cr_student_deleted
update studentmaxid set id=id-@cnt,dates=getdate()
commit tran






GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

delete from studentmaxid
insert studentmaxid values(0,getdate())
delete from student
insert student(name) values('test1')
insert student(name) values('test2')
insert student(name) values('test3')
insert student(name) values('test4')
insert student(name) values('test5')
insert student(name) values('test6')

insert student(name) select rtrim(name)+'0' from student

delete student where id between 8 and 9

select * from student

hackerning 2001-10-22
  • 打赏
  • 举报
回复
问题是并没有建立关联啊
Jack_Loo 2001-10-15
  • 打赏
  • 举报
回复
如果有error的话,你肯定在表结构中建了关联,那么就相当麻烦了(你还要update其他表),不如不做。
zds0707 2001-10-15
  • 打赏
  • 举报
回复
同意楼上的,其实这种做法就代来不必要的麻烦。
to weixxxp(想一想) :
同意"IDENTITY字段一般用作关键字,并且只做识别用无实际意义,随便乱改什么"
但是"怎么保证完整性"好象不太对吧?

如果涉及数据复制,你就知道了,如:

有两台数据库服务器A、B,它们的出版物中有一表,关键字为IDENTITY,均有30条记录。

现在A删除第15条,B增加一条记录,想一想数据复制的结果会怎样?尤其是IDENTITY字段?




signboy 2001-10-14
  • 打赏
  • 举报
回复
换个思路,解决吧,你用这个字段干吗用呢,
主健?被其他表引用了,那就麻烦了
排序?
hackerning 2001-10-14
  • 打赏
  • 举报
回复
用触发器再CBUILDER总有ERROR出现,解决不了啊
Jack_Loo 2001-10-03
  • 打赏
  • 举报
回复
做触发器,
针对update和delete
KingSunSha 2001-10-03
  • 打赏
  • 举报
回复
不明白你这么做的目的是什么?
我不认为有会什么好的方案. 我回答过好几个关于如何根据ROWNUM更新字段的问题, 你去找一下看, 希望对你有用.
hackerning 2001-10-03
  • 打赏
  • 举报
回复
呵呵,我再此强调并没有片大家得意思,现在加分数

难到就没有一个好得解决方案了吗
Azz1 2001-09-30
  • 打赏
  • 举报
回复
用触发器
weixxxp 2001-09-30
  • 打赏
  • 举报
回复
众位大哥到底学没学过‘数据库原理’,IDENTITY字段一般用作关键字,并且只做识别用无实际意义,随便乱改什么,怎么保证完整性。
sunling 2001-09-30
  • 打赏
  • 举报
回复
如果可以,微软早做了。还用我们来忙呼?
smartdonkey 2001-09-30
  • 打赏
  • 举报
回复
同意,确实没有意义
wzgchina 2001-09-30
  • 打赏
  • 举报
回复
对呀,干吗费用identify,自己建一个字段递增不就好了。
superrg 2001-09-29
  • 打赏
  • 举报
回复
楼上的说得不错,大家一起学习吧,欢迎到:http://www.csdn.net/expert/TopicView.asp?id=305995
KingSunSha 2001-09-29
  • 打赏
  • 举报
回复
这样的功能在大型的多用户数据库应用中根本就不会去考虑, 或者说实现的代价太大.
比如一个表中有100万条纪录,我删除了第2条纪录, 那是不是要更新99万多条纪录啊?如果经常删除纪录那服务器整天就忙着调整序号,也别做别的事了.
cookise 2001-09-29
  • 打赏
  • 举报
回复
真没意思
争这个有用吗?????????
nononono 2001-09-27
  • 打赏
  • 举报
回复
9Thoughts(一片绿洲), 你认为你是好人, 我在争这个分数? 你太天真了.

我说这些是因为我不喜欢在这里用"高"分数欺骗这么多的热心人.
加载更多回复(9)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧