sql 表的主键是自增序列,如何解决删除的id...
在SQLserver数据库中一个表的主键是自增序列,假如根据id删除一条语句.(这样的话感觉序列不连续)然后再插入一条语句,要求插入的这条语句插入到删除那条语句的id位置...
在SQL server数据库中 一个表的主键是自增序列,假如根据id删除一条语句.
(这样的话感觉序列不连续) 然后再插入一条语句,要求插入的这条语句插入到删除那条语句的id位置?
或者是此id之后的id号都同时减1?
比如
person 表:
id name age
1 张飒 19
2 李思 20
3 王武 18
4 赵柳 22
5 孙二 21
比如现在我删除id = 3的数据,则变为:
id name age
1 张飒 19
2 李思 20
4 赵柳 22
5 孙二 21
第一种情况: 当我插入一条新的数据时候,把它补充到第三条(即id=3),如果再插入数据,则使其id从5后面递增
id name age
1 张飒 19
2 李思 20
3 倩儿 17 --插入的第一条
4 赵柳 22
5 孙二 21
6 吴俊 22 --插入的第二条
第二种情况: 当我删除id=3的数据的时候,能不能使其后面的id号都同时减1
id name age
1 张飒 19
2 李思 20
3 赵柳 22
4 孙二 21
5 倩儿 17 --插入的第一条
这两种情况能实现吗?如果能,该怎么实现? 展开
(这样的话感觉序列不连续) 然后再插入一条语句,要求插入的这条语句插入到删除那条语句的id位置?
或者是此id之后的id号都同时减1?
比如
person 表:
id name age
1 张飒 19
2 李思 20
3 王武 18
4 赵柳 22
5 孙二 21
比如现在我删除id = 3的数据,则变为:
id name age
1 张飒 19
2 李思 20
4 赵柳 22
5 孙二 21
第一种情况: 当我插入一条新的数据时候,把它补充到第三条(即id=3),如果再插入数据,则使其id从5后面递增
id name age
1 张飒 19
2 李思 20
3 倩儿 17 --插入的第一条
4 赵柳 22
5 孙二 21
6 吴俊 22 --插入的第二条
第二种情况: 当我删除id=3的数据的时候,能不能使其后面的id号都同时减1
id name age
1 张飒 19
2 李思 20
3 赵柳 22
4 孙二 21
5 倩儿 17 --插入的第一条
这两种情况能实现吗?如果能,该怎么实现? 展开
6个回答
展开全部
楼主想通直接调整记录的插入顺序来满足需求逻辑太复杂,维护起来也不方便。如果情况允许的话不妨在查询的结果集中构造一个自增列。前提是SQL Server版本必须是2005或更高的版本。
假设你的表名是Table1
SELECT ROW_NUMBER() OVER (ORDER BY id) AS NewId,name,age
FROM table1;
结果中NewId就是一个从1开始递增的列。
假设你的表名是Table1
SELECT ROW_NUMBER() OVER (ORDER BY id) AS NewId,name,age
FROM table1;
结果中NewId就是一个从1开始递增的列。
追问
这个方法不错,不过他只是显示一个结果集,在原表中还是没有本质上修改...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-06-07
展开全部
建议:第一种情况用存储过程做
首先你先查询所有的记录ID,从最小ID循环到最大ID,和数据库中的比较,如果所有记录中没有间断,就直接插入新数据,如果所有记录中有间断的,查询出最小的间断ID,然后设置主键不自增,插入新数据,设置其ID为最小的间断的ID
首先你先查询所有的记录ID,从最小ID循环到最大ID,和数据库中的比较,如果所有记录中没有间断,就直接插入新数据,如果所有记录中有间断的,查询出最小的间断ID,然后设置主键不自增,插入新数据,设置其ID为最小的间断的ID
追问
如果主键不设置自增,那么每次插入新的数据后,ID号不都得自己输入啊?
追答
如果主键不自增的话,那可以这样,你查出所有记录中最大的MaxID,如果是没有间断的,就把新的数据的ID等于MaxID+1,就可以插入新数据了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给你一个触发器,当你删除一条,id递减
create trigger delid
on 表名
for delete
as
begin
if @@rowcount=1
update 表名 set id=id-1 where id>(select id from deleted)
end
仅限删除一行,如果删除多行,请追分追问
create trigger delid
on 表名
for delete
as
begin
if @@rowcount=1
update 表名 set id=id-1 where id>(select id from deleted)
end
仅限删除一行,如果删除多行,请追分追问
更多追问追答
追问
如果删除多行,且删除的id都是不连续的,那该又如何呢?
追答
create trigger delid
on 表名
for delete
as
begin
if @@rowcount=1
update 表名 set id=id-1 where id>(select id from deleted)
else
begin
declare @count int,@min int ,@ii int
select @min=1
select @count=count(*) from 表名 where id>@min
select @ii=min(id) from deleted
while @min@ii)
set @ii=@ii+1
set @min=@min+1
end
else
set @ii=(select min(id) from deleted where id>@ii)
end
end
end
--包含1行和多行触发器,楼主是个守财奴:)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
表的主键是自增序列时,是不允许你说的这两种操作的.
因为对于自增序列,系统会记录一个"水位"值,每次增加记录时自动修改这个值并将新值作为插入记录的主键.这个是数据库系统实现的时候就确定的,修改不了
因为对于自增序列,系统会记录一个"水位"值,每次增加记录时自动修改这个值并将新值作为插入记录的主键.这个是数据库系统实现的时候就确定的,修改不了
追问
soga , 我懂了! 我这个是个人的突发奇想, 实际上确实如你所说! 如果要强行修改主键ID,应该还是可以的吧?
追答
如果设置了自增序列,强行修改是不允许的,这个我试过
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询