详谈关系数据库中的“键”(续1)

      1 )天然主键
               在现实生活中存在着许多看起来可以惟一地标识一行记录的值,如:身份证号码、汽车牌照号码等。数据库逻辑模式设计往往会使用这些天然的主键,尽管这些天然主键中没有哪一个是十分可靠的。
                可以让用户把它们当作查找和命名一行记录的 主键 ,但绝不能把它们作为实际的主键。
                 如果必须使用一个天然主键,则必须保证对于每一个引用了这个天然主键的外键都启用了级联更新选项,这样在更新主键时就不会破坏参照完整性了。
        2 SQL Server 的主键约束
                 SQL Server 使用约束来维护主键和外键。约束的用途在于:确保新数据满足指定的要求,否则将拒绝相应的数据修改操作。
                 主键约束实际上是通过 Unique 约束(不是空置约束)以及聚集或者非聚集惟一索引来实现的。
                       注:主键应当是没有实际意义的、单列的、计算机生成的、不可编辑的,而且对于用户来说应当是不可见的。另外,防止用户查看和操作键是一个成功的数库开发人员所要达到的主要目标之一。
        企业管理器使用聚集索引创建主键,这种实现方法并不好。如果要使用企业管理器这个图形工具来创建物理模式,应当手工将主键索引重新设置为非聚集索引。在代码中,可以使用以下两种方式之一把某个(某些)列设置为主键:
  CREATE TABLE dbo.Guide (
     GuideID INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED ,
     ... ...
  或者
     ALTER TABLE dbo.Guide ADD CONSTRAINT
           PK_Guide PRIMARY KEY NONCLUSTERED (GuideID)
           ... ...
      有两种类型最适合于做主键:标识列( IDNETITY )和全局惟一标识符列( GUID )。
       A. 使用 IDENTITY
             到目前为止,大多数广为使用的主键创建方法都与标识列的使用有关。当新的记录行插入到数据库中时,标识列都会为它们生成连续的整数。你还可以任意的设定标识列的种子值和增量值。
            标识列具有以下的优点: a. 整数比 GUID 更容易人工识别和编辑。
                                                      b. 整数比 GUID 占用空间小而且快。当然,这样的性能差别只有当你循环执行数千个 select 语句才能显现出来。
             标识列的值是在插入新的记录行时由 SQL Server 创建的。除非将 set insert_identity 选项设置为 true ,否则,试图在标识列中插入数据或者更新标识列中的数据都会产生错误。
       B. 使用 GUID
            SQL Server uniqueidentifier 数据类型与 COM 的全局惟一标识符相对应。虽然标识列和 GUID 都是惟一的,但与标识列相比, GUID 可以在更大范围内保证唯一性。它具有如下优点:
            a. 复制使用 GUID 主键的数据库时,不必额外作全面的检查。
            b. GUID 值的随机性可以减少数据库的热点。
            c. GUID 可以避免用户使用具有实际意义的主键,或者为主键赋予实际的意义。
            d. GUID 可以避免这样的连接错误,即:查询时连接了错误的表,但系统依旧返回了结果。因为如果使用了 GUID ,这些表的记录行在键所对应的那些列上是不可能取同样的整数值的。
            e. GUID 的值是用不完的。
            f. 可以使用多种方法来生成 GUID 的值,包括:使用列的默认值、 select 语句的表达式或者 select 语句之前的代码,因此,使用 GUID 编程要容易的多。此外,使用 GUID 可以避免使用标识列时会出现的数据修改问题。
      在下面的脚本中,将 PorductID 列的数据类型设置为 uniqueidentitfier ,并指定它不能够取空值。该列的 rowguidcol 属性被设置为 true ,这使得复制程序能够检测并使用它。它的默认值是新生成的 uniqueidentifier Product 表将它作为主键,它使用了非聚集的惟一索引。
 CREATE TABLE dbo.Product (
    ProductID UNIQUEIDENTIFIER NOT NULL
          ROWGUIDCOL  DEFAULT (NEWID())
          PRIMARY KEY NONCLUSTERED,
          ... ...
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值