zoukankan      html  css  js  c++  java
  • 浅析主键自增长的优缺点

    主键应该怎样设计?目前主要用到的主键方案共三种

    自动增长主键

    手动增长主键

    UNIQUEIDENTIFIER主键

    1、先说自动增长主键,它的优点是简单,类型支持bigint.但是它有致命的弱点:

    当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢?

    2、再说手动增长主键,它的优点是自行定制主键列,主键列的数据类型乃至数据样本都可以控制,能够稳定的获得目标键值,不会重复.但是它维护成本比较搞,首先生成键值需要自行编写存储过程来产生,网络开销大,运行时还要考虑到并发冲突等等.

    3、最后就是UNIQUEIDENTIFIER主键,它利用GUID作为键值,可以直接调用newid()来获得全局唯一标识,即便合并数据表也不会有重复现象.但是UGID有两个弱点:其一,和int类型比较,GUID长度是前者4倍.其二,用newid()获得的GUID毫无规律,因为该列作为主键,必然有聚集索引,那么在插入新数据时,将是一个非常耗时的操作.这样的话UNIQUEIDENTIFIER作为主键将大大有损效率.

    所以SQLServer2000环境下DBA们往往写一个存储过程来生成与时间有关的GUID,即在GUID前面加上生成时间.这样确保生成出来的主键全局唯一并且按时间递增.不过这又回到了第二种主键方案,不便维护.

    4、SQLServer 提供了新的解决方法,使用的是NEWSEQUENTIALID(),这个函数产生的GUID是递增的,下面看下它的用法

    --创建实验表

    --1创建id列的类型为UNIQUEIDENTIFIER

    --2ROWGUIDCOL只是这个列的别名,一个表中只能有一个

    --3PRIMARY KEY确定id为主键

    --4使用DEFAULT约束来自动为该列添加GUID

    create table jobs

    (

    id UNIQUEIDENTIFIER ROWGUIDCOL PRIMARY KEY  NOT NULL

    CONSTRAINT [DF_jobs_id] DEFAULT (NEWSEQUENTIALID()),

    account varchar(64) not null,

    password varchar(64) not null

    )

    go

     

    select * from jobs

    --添加实验数据

    insert jobs (account,password) values ('tudou','123')

    insert jobs (account,password) values ('ntudou','123')

    insert jobs (account,password) values ('atudou','123')

    insert jobs (account,password) values ('btudou','123')

    insert jobs (account,password) values ('ctudou','123')

     

    select * from jobs

     

  • 相关阅读:
    Sass--扩展继承
    Sass--混合宏的不足
    学习笔记47—PhotoShop技巧
    学习笔记46—如何使Word和EndNote关联
    学习笔记45—Linux压缩集
    学习笔记44—Linux下安装freesurfer
    学习笔记43—Linux安装集
    学习笔记42—Win7下安装Linux双系统
    学习笔记41—ttest误区
    学习笔记40—endnote点点滴滴
  • 原文地址:https://www.cnblogs.com/ShaYeBlog/p/5614432.html
Copyright © 2011-2022 走看看