小议sqlserver主键和自动编号问题

小议sqlserver主键和自动编号问题

ID:10683609

大小:58.50 KB

页数:5页

时间:2018-07-07

小议sqlserver主键和自动编号问题_第1页
小议sqlserver主键和自动编号问题_第2页
小议sqlserver主键和自动编号问题_第3页
小议sqlserver主键和自动编号问题_第4页
小议sqlserver主键和自动编号问题_第5页
资源描述:

《小议sqlserver主键和自动编号问题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、小议SQLServer主键和自动编号问题>>教育资源库  所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。  当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。  常见的数据库主键选取方式有:  ◆自动增长字段  ◆手动增长字段  ◆UniqueIdenti

2、fier  ◆B(bine)类型  一、自动增长型字段  很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQLServer数据库的话,我们还可以在记录插入后使用IDENTITY全局变量获取系统分配的主键键值。  尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有两张表:  Order(OrderID,OrderD

3、ate)  OrderDetial(OrderID,LineNum,ProductID,Price)  Order表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:  首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以

4、获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。  听棠.指出:主档放在事务中提交时,通过IDENTITY就可以取到生成值的,因此可以传给明细当外键用,而且在事务发生错误回滚时,主档记录也会被回滚取消的。  吕震宇补充:使用自动增长字段会增加网络的roundTrip。尽管可以使用IDENTITY取得主键的值,但在更新过程中,不得不增加一次

5、数据往返(以C/S结构为例):  1、客户端发送开始事务命令  2、客户端提交主表更新  3、服务器返回IDENTITY  4、客户端根据返回的主键更新从表缓冲  5、客户端将从表提交服务器更新  6、客户端提交事务  在这里多了一次往返就会增加了事务处理的时间。降低并发性能。  如果不用自动增长型字段,将是以下情景:  1、客户端发送开始事务命令  2、客户端提交主表更新  3、客户端提交从表更新  4、客户端提交事务  因此我不赞成使用自动增长型字段作为主键与外键链接的纽带。  除此之外,当我们需要在多个数据库间进行数据的复制时

6、(SQLServer的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?  ADO.允许我们在DataSet中将某一个字段设置为自动增长型字段,但千万记住,这个自动增长字段仅仅是个占位符而已,当数据库进行更新时,数据库生成的值会自动取代ADO.分配的值。所以为了防止用户产生误解,建议大家将ADO.中的自动增长初始值以及增量都设置成-1。此外,在ADO.中,我们可以为两张表建立Data

7、Relation,这样存在级联关系的两张表更新时,一张表更新后另外一张表对应键的值也会自动发生变化,这会大大减少了我们对存在级联关系的两表间更新时自动增长型字段带来的麻烦。  二、手动增长型字段  既然自动增长型字段会带来如此的麻烦,我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个KeyName,就可以知道目前的KeyValue是什么

8、,然后手工实现键值数据递增。在SQLServer中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:CREATE PROCEDURE [GetKey] KeyName char(10), KeyValue int OUTPU

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。