A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wanghuailin1030 中级黑马   /  2013-6-6 10:40  /  3079 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wanghuailin1030 于 2013-6-8 16:38 编辑

SQL数据库中,只有设置为“标识”才能设置为自动增长。但是经过删除之后,数据库跳过删除数据的ID,直接加一。比如删除ID=5的数据,以后再插入式ID从6开始插入,5就没有了。怎样让数据从1到n排列,把5加上?我知道这样做对程序设计没有影响,但是考官的面试题得过啊。

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

11 个回复

倒序浏览
1. 如果后台数据库是Microsoft SQLServer数据库,用标识列实现自增可以避免并发问题,不要开发人员控制自增,只需修改下一个自增的原始数据就能避免用标识列的字段在insert的时候不用指定主键的值;
2. 如果后台数据库是甲骨文公司的ORACLE数据库的话,只需修改触发器里面的原始递增数据就能避免用标识列的字段在insert的时候不用指定主键的值.
回复 使用道具 举报
select *,ROW_NUMBER() over(order by id) from T_table

内置函数ROW_NUMBER
回复 使用道具 举报
如果你想自己加上5的话。。可以
set IDENTITY_insert 表 on
insert

set IDENTITY_insert 表 off
回复 使用道具 举报
刚才百度了一圈,得到一个结论,这东西肯定要用到触发器,而且不能用自动增长列,当数据被删掉了就得触发事件,对序号进行更新,我没写过触发器,就只能说这么多了
回复 使用道具 举报
这个问题 我在工作中遇到过 但当时 好像 用了讨巧的方法
TRUNCATE  TABLE 表名
可以 实现 删除之后 再从ID = 1 开始 加数据
{:soso_e113:}
回复 使用道具 举报
一直在努力 发表于 2013-6-6 13:04
如果你想自己加上5的话。。可以
set IDENTITY_insert 表 on
insert

你的方法确实可以插入,但是会有ID唯一性冲突的问题。你看看。

1.jpg (13.9 KB, 下载次数: 0)

ID设置为主键

ID设置为主键

2.jpg (8.93 KB, 下载次数: 0)

会有重复的数据,不能保证唯一性

会有重复的数据,不能保证唯一性

3.jpg (9.4 KB, 下载次数: 0)

这是我写的语句

这是我写的语句
回复 使用道具 举报
本帖最后由 wanghuailin1030 于 2013-6-7 15:10 编辑
无__畏 发表于 2013-6-6 11:27
select *,ROW_NUMBER() over(order by id) from T_table

内置函数ROW_NUMBER


select*, ROW_NUMBER() over(order by id)as newid from temp
可以执行,但不是我要的答案

4.jpg (7.3 KB, 下载次数: 0)

4.jpg
回复 使用道具 举报
许庭洲 发表于 2013-6-6 10:52
1. 如果后台数据库是Microsoft SQLServer数据库,用标识列实现自增可以避免并发问题,不要开发人员控制自增, ...

你的意思是不是如图这样子,是可以从指定的数加1.但是已经插入过的数据,就只能按照最大的ID来。比如10以后的删掉,从10开始可以依次递加,但是如果9删掉,插入10.那也只能从11开始加,9还是加不上去

6.jpg (5.73 KB, 下载次数: 0)

6.jpg

5.jpg (7.75 KB, 下载次数: 0)

5.jpg
回复 使用道具 举报
wanghuailin1030 发表于 2013-6-7 14:24
你的方法确实可以插入,但是会有ID唯一性冲突的问题。你看看。

不是..这是为了解决删了那条数据..ID..加回去的...一般会自己先检查一次.在插
回复 使用道具 举报
一直在努力 发表于 2013-6-7 22:15
不是..这是为了解决删了那条数据..ID..加回去的...一般会自己先检查一次.在插 ...

行吧,那算解决了。谢谢
回复 使用道具 举报
漂过
,。,。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马