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 --插入的第一条

这两种情况能实现吗?如果能,该怎么实现?
展开
 我来答
lzp4881
2011-06-07 · TA获得超过2394个赞
知道大有可为答主
回答量:2825
采纳率:0%
帮助的人:3005万
展开全部
没有必要,不连续就不连续。干吗必要连续。
ID本来就是作为数据的唯一标识用的,只要是唯一的就行,连不连续无所谓。
因为如果连续的话,那么你每次删除数据都要进行ID重新排列,这样当数据较多时,会严重影响速度,所以大家都不这样作。
追问
嗯, 这个建议很有价值!
百度网友5c91d28
2011-06-07 · TA获得超过5084个赞
知道大有可为答主
回答量:1916
采纳率:50%
帮助的人:1714万
展开全部
楼主想通直接调整记录的插入顺序来满足需求逻辑太复杂,维护起来也不方便。如果情况允许的话不妨在查询的结果集中构造一个自增列。前提是SQL Server版本必须是2005或更高的版本。

假设你的表名是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号不都得自己输入啊?
追答
如果主键不自增的话,那可以这样,你查出所有记录中最大的MaxID,如果是没有间断的,就把新的数据的ID等于MaxID+1,就可以插入新数据了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
skyfukk
推荐于2017-11-24 · TA获得超过1187个赞
知道小有建树答主
回答量:966
采纳率:100%
帮助的人:634万
展开全部
给你一个触发器,当你删除一条,id递减

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行和多行触发器,楼主是个守财奴:)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nietiezheng
2011-06-07 · TA获得超过5536个赞
知道大有可为答主
回答量:3132
采纳率:87%
帮助的人:1226万
展开全部
表的主键是自增序列时,是不允许你说的这两种操作的.
因为对于自增序列,系统会记录一个"水位"值,每次增加记录时自动修改这个值并将新值作为插入记录的主键.这个是数据库系统实现的时候就确定的,修改不了
追问
soga , 我懂了!  我这个是个人的突发奇想, 实际上确实如你所说! 如果要强行修改主键ID,应该还是可以的吧?
追答
如果设置了自增序列,强行修改是不允许的,这个我试过
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式