仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 690|回复: 8
打印 上一主题 下一主题

[学习教程] SQL SERVER中自增量(标识列)反复缘故原由剖析

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
InnoDB数据表的索引,与InnoDB数据表相比,在InnoDB数据表上,索引对InnoDB数据表的重要性要大得多。在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。我们都晓得在SQLServer中,自增量(标识列)中的值是我们在拔出数据时依据我们设置的肇端值与阶步值主动赋值,可是不是如许标识列中就永久没有反复值呢?实在不是,SQLSERVER中同意存在反复的标识值,SQLServer也不会自动反省表中是不是存在反复的标识值。

在以下两种情形下,SQLSERVER的标识列中,就会存在反复的值。
1,使用setidentity_insert开关,强迫拔出反复的标识值。

关于setidentity_insert的用法,请参看本站上面文章:
往自增列拔出显式值-SETIDENTITY_INSERT详解

我们能够来做个树模:
先创立一个示例表:
createtabletb
(
IDintidentity(1,1),
testvarchar(50)
)

然后往表tb中拔出两条测试数据:
inserttb(test)values(a)
inserttb(test)values(b)

然后检察表中数据
IDtest
1a
2b

这是一般的,没有反复的标识值,然后我们使用setidentity_inserton强迫拔出反复标识值:
setidentity_inserttbon
inserttb(id,test)values(1,a)
inserttb(id,test)values(1,a)
setidentity_inserttboff

再来检察表中数据
IDtest
1a
2b
1a
1a
这时候候,表中就会有反复的标识值了,并且我们在实行下面SQL时也没有报错。

2,使用DBCCCHECKIDENT重置了以后标识值。
这个缘故原由对照复杂了,好比以后表中的标识值已排到10了,这时候候,我们重置以后标识值为1,那末新的标识列又会从1入手下手,以是如许表中也会发生反复的标识值。

关于DBCCCHECKIDENT的用法,请参看本站上面文章:
重置SqlServer表的自增列,让自增列从头入手下手记数

我们仍是来做个树模,先使用truncatetable来清空表tb中数据
先实行SQL语句truncatetabletb清空表tb中的数据,并使自增量从1入手下手。

truncatetable的用法,请参看本站:
SqlServer中truncatetable与delete语句的区分

然后我们往表中拔出三条测试数据
inserttb(test)values(a)
inserttb(test)values(b)
inserttb(test)values(c)

检察表中的数据
IDtest
1a
2b
3c

然后我们使用CHECKIDENT重置以后标识值:
DBCCCHECKIDENT(tb,RESEED,1)

然后再往表中拔出一条新的数据
inserttb(test)values(d)

检察表中数据
IDtest
1a
2b
3c
2d

能够看到,新的标识值又从2入手下手了,并且表中发生了反复的标识值2。

总结:SQLSERVER中是能够存在反复的标识值的,假如要确保列中不存在反复值,请利用主键或独一键束缚,大概设置列为uniqueidentifier数据范例。mysqld进程在一个写入当中被杀死;计算机的意外关闭(例如,如果计算机掉电);一个硬件错误。
小妖女 该用户已被删除
沙发
发表于 2015-1-18 12:11:32 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
简单生活 该用户已被删除
板凳
发表于 2015-1-25 17:14:53 | 只看该作者
如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-3 12:02:30 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
老尸 该用户已被删除
5#
发表于 2015-2-26 13:17:59 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
精灵巫婆 该用户已被删除
6#
发表于 2015-3-8 15:25:21 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
爱飞 该用户已被删除
7#
发表于 2015-3-16 03:52:24 | 只看该作者
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
8#
发表于 2015-3-22 20:10:20 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
山那边是海 该用户已被删除
9#
发表于 2015-3-22 20:10:21 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 18:59

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表