2012-04-14 73 views
1

生成表的主键时最好的方法是什么?主键生成的方法

也就是说,当数据库接收的数据不是内射的并且不能用作主键时。

在代码中,管理表行主键的最佳方法是什么?

谢谢。

+0

对不起,但我不明白'内射'。你什么意思? – Steve 2012-04-14 10:38:15

+0

“内射函数是一种保持独特性的函数”# – nothrow 2012-04-14 11:08:57

回答

2

首先建议远离唯一标识符躲避的主​​键。虽然它有一些有趣的简单方法来生成它的客户端,但它使几乎不可能对主键有任何意义可能是有用的。如果我能够及时回去并且禁止99%使用过的地方使用独特识别标志,那么在过去的2年里这将节省3人以上的dba /开发时间。

这是我推荐的,使用INT IDENTITY作为主键。

create table YourTableName(
    pkID int not null identity primary key, 
    ... the rest of the columns declared next. 
) 

其中pkID是您的主键列的名称。

这应该做你正在寻找。

+0

有趣。你能否延续你的建议,并解释为什么你的经验与uniqueidentifiers是如此糟糕。为什么你不能有任何有用的索引?那是因为字体大小和索引大小? – huhu78 2012-04-14 21:30:49

+0

在索引中使用uniqueidentifiers,因为没有自然的排序顺序,所以效率非常低。基于索引的b-tree结构,当使用uniqueidentifiers时,最终会产生极其分散的索引。重建或重组后,它们仍然非常分散。所以你最终会得到一个较慢的索引,由于存在碎片,最终会导致在内存和磁盘上非常庞大。同样,在插入uniqueidentifier时,您更可能最终在索引上进行页面拆分,从而减慢插入速度。通常,uniqueidentifiers对于索引是个坏消息。 – 2012-04-14 22:05:26

+0

好点。我会记得的。我认为妥协可能是将uniqueidentifier作为主键,并构建CLUSTERED索引,包括不唯一但在uniqueidentifier列前排序数据列。然后你在表格/页面中有“物理”和有用的数据顺序。 – huhu78 2012-04-15 11:07:52

2

AUTO_INCREMENT在MySQL,IDENTITY在SQL Server ..

1

在SQL Server IDENTITY

,如果你需要得到了解你的新ID是什么,而INSERT -ing数据,使用INSERT声明OUTPUT条款 - 所以新行的副本放在table-type参数中。

如果由于某些原因在SQL中生成唯一ID不适合您,请在您的应用程序中生成GUID - GUID具有非常高的独特性(但实际上并不能保证)。 SQL Server具有专用的GUID类型 - 它被称为uniqueidentifier

http://msdn.microsoft.com/en-us/library/ms187942.aspx