2010-06-20 87 views
0
SELECT COUNT(*) FROM table_name; 

我的算法是:GUID。和自动ID在SQL数据库主键

  • 检查计
  • 数+ 1为新的主键的起点
  • 然后保持每天插入操作前递增

但这是什么GUID? SQL Server是否提供了自动生成和增加主键的东西?

回答

3

我不确定你是否也在询问有关IDENTITY或GUID是唯一的标识符(几乎)保证是唯一的。它可以在主键上使用,但不建议使用,除非您正在执行脱机工作或计划合并数据库。

例如 “正常”,IDENTITY主键是

1 Jason 
2 Jake 
3 Mike 

与另一数据库,它看起来像

1 Lisa 
2 John 
3 Sam 

将是棘手的合并时。你得重新输入某些列,请确保您的FKS是为了等使用的GUID,数据看起来是这样的,而且很容易合并:

1FB74D3F-2C84-43A6-9FB6-0EFC7092F4CE Jason 
845D5184-6383-473F-A5D6-4DE98DBFBC39 Jake 
8F515331-4457-49D0-A9F5-5814EE7F50BA Mike  
CE789C89-E01F-4BCE-AC05-CBDF10419E78 Lisa 
4D51B568-107C-4B63-9F7F-24592704118F John 
7FA4ED64-7356-4013-A78A-C8CCAB329954 Sam 

注意,一个GUID需要除了INT之外,还有更多的空间,因此建议将INT用作主键,除非您绝对需要。

1

创建表的表 (ID INT恒等式(1,1)主键, COL1 VARCHAR(10) )

将自动为您创建的主键。 检查T-SQL中的GUID,目前没有。

+0

可你犯了一个名为“INT”列?不管怎样,我相信你的意思是'id int indentity(1,1)主键' – 2010-06-20 18:27:20

+0

是的,我的意思是id int。现在修复它,谢谢。 – Raj 2010-06-20 18:44:47

5

有3个选项

CREATE TABLE A 
(
ID INT IDENTITY(1,1) PRIMARY KEY, 
... Other Columns 
) 

CREATE TABLE B 
(
ID UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
... Other Columns 
) 

CREATE TABLE C 
(
ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() PRIMARY KEY, 
... Other Columns 
) 

原因之一,你可能更喜欢是C而不是B.将减少碎片,如果你使用的ID as the clustered index

1

使用计数,然后计数+1作为关键的问题是,如果您要从中间删除记录,则最终会生成重复密钥。 EG:

Key Data  
1  A   
2  B 
3  C 
4  D 

现在删除B(计数变为3),并插入E.这试图使新的主密钥作为4,其已经存在。

Key Data  
1  A   
3  C 
4  D <--After delete count = 3 here 
4  E <--Attempted insert with key 4  

您可以使用主键和自动递增,以确保你没有这个问题

CREATE TABLE myTable 
(
    P_Id int NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (P_Id) 
) 

或者你可以使用GUID。如何的GUID工作是通过创建128位的整数(表示为一个32字符十六进制字符串)

Key          Data 
24EC84E0-36AA-B489-0C7B-074837BCEA5D  A 
. 
. 

这导致2^128个可能值(reaaally大),所以建立了类似的值的可能性由一个计算机是非常小。除此之外,还有一些算法可以帮助尝试并确保不会发生。所以GUID也是一个关键的不错选择。

至于是否使用整数或GUID,通常是依赖于应用程序,政策等