|
本文赞同:
①主键是必需的
②主键应和业务无关
③主键是单列的
④自记录插入后,主键不会被更新
===========================================================
1.自动增长的数值类型
即新建一个ID字段,自动增长。
优点:数字型,占用空间小,易排序。数据库自动编号,速度快。增量增长,聚集型主键按顺序存放,有利于检索非常。
缺点:手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突。
2.控制增长的字符串类型
是第一种方案的改进版。为方便以后的数据导入,可以用字符串类型存储纯数字的主键(纯数字好处不啰嗦)。用一张表维护最后插入记录的主键,解决max()带来的性能问题,并用存储过程为新插入的记录生成主键。
3.GUID
优势:具有唯一性,在任何情况下,可以产生全球唯一的值,方便数据导入。
不足:结构过长且无序,不易记忆,索引的空间大,所以检索时间长。GUID的产生不是以一定的次序产生,对于按主键物理索引的数据库来说,当新的GUID进来时,它会把所有GUID重新排序,这将影响数据插入效率。
- insert into t_table (id) values (newid())
- newid() 可以得到 guid
- id这个字段类型必须是 uniqueidentifier 类型的。
复制代码 在SQL Server 2005中有一个数据类型uniqueidentifier,这个数据类型就是用于支持GUID(Global Unique Identifier)。这个类型的值是一个长度为32的定长字符串,比如”00000002-3378-a87f-92pj-2t68i97o34ms”。GUID可以保证该ID的全局唯一性,方便数据库整合,以免因为数据互相Copy以及转化过程中因为ID相同引起不必要的冲突。在C#中有Guid类,方便我们生成和操作GUID。比如Guid.NewGuid.ToString()就可以得到一个新的GUID字符串。其实,GUID本质上可以认为是时间戳的MD5 Hash。在Lotus中,每个Document都有一个全局的唯一标识称作UNID(unique identifier)。这个UNID和上述GUID有着相同的机制。笔者在最近的项目中就完成了Lotus文档数据库向SQL Server 关系数据库转化的工作。涉及了比较多的GUID和UNID的操作。在SQL Server 2005中,uniquidentifier类型值总是可以用casting转化为定长(32)的varchar类型。
本文参考:http://www.cnblogs.com/xianbing/archive/2012/02/19/2358105.html
http://blog.chinaunix.net/u/6776/showart_502529.html
http://zhidao.baidu.com/question/397533067.html
|
|