2013-09-26 151 views
5

我的公司目前正在重寫最近獲得的應用程序。我們選擇使用ASP.net mvc4來構建這個系統,並使用Entity Framework作爲我們的ORM。我們收購的公司以前的所有者非常堅定我們使用他們的舊數據庫,並且不改變它的任何內容,以便客戶可以在開發不同模塊的同時與舊系統同時使用我們的產品。SQL Server中主鍵和唯一索引之間的區別

我發現舊錶結構沒有主鍵,而是使用唯一索引作爲主鍵。現在,當使用實體框架時,我嘗試在結構中匹配它們的表,但由於EF生成的是主鍵而不是唯一索引,因此無法這樣做。

當我與前一位老闆聯繫並解釋它時,他告訴我「每張表中的唯一鍵是主鍵,它們是對方的同義詞。」

我對數據庫系統還比較陌生,所以我不確定這是否正確。任何人都可以澄清這一點?

時轉儲到SQL他的表生成:

-- ---------------------------- 
-- Indexes structure for table AT_APSRANCD 
-- ---------------------------- 
CREATE UNIQUE INDEX [ac_key] ON [dbo].[AT_APSRANCD] 
([AC_Analysis_category] ASC, [AC_ANALYSI_CODE] ASC) 
WITH (IGNORE_DUP_KEY = ON) 
GO 

但是我的系統生成:

-- ---------------------------- 
-- Primary Key structure for table AT_APSRANCD 
-- ---------------------------- 
ALTER TABLE [dbo].[AT_APSRANCD] ADD PRIMARY KEY ([AC_Analysis_category]) 
GO 

編輯: 跟進問題,這是我將如何去設計模型爲了這?我只習慣使用將其定義爲主鍵的[Key]註釋,如果沒有它,EF將不會生成該表。 所以是這樣的:

[Table("AT_APSRANCD")] 
public class Analysis 
{ 
    [Key] 
    public string AnalysisCode { get; set; } 
    public string AnalysisCategory { get; set; } 
    public string ShortName { get; set; } 
    public string LongName { get; set; } 
} 
+0

檢查我的答案EF中的示例複合鍵。 – paqogomez

+0

請注意其他區別:原始文件位於兩列之上,原稿忽略重複值。 –

+1

如果數據庫已經存在,爲什麼不讓EF生成所有實體? – RobH

回答

5

SQL UNIQUE Constraint

UNIQUE約束唯一標識數據庫 表中每條記錄。

UNIQUE和PRIMARY KEY約束條件都爲一列或一組列的唯一性提供了 保證。

A PRIMARY KEY約束自動具有在其上定義的UNIQUE約束。

請注意,每個表可以有多個UNIQUE約束,但每個表只能有一個 PRIMARY KEY約束。

此外,從Create Unique Indexes

不能對單個列創建唯一索引,如果該列 中包含NULL多行。同樣,如果 列的組合在多行中包含NULL,則不能在多個列上創建 唯一索引。這些被視爲重複的 值爲索引的目的。

而從Create Primary Keys

所有列的PRIMARY KEY約束內定義必須定義爲 NOT NULL。如果未指定可空性,則在PRIMARY KEY約束中參與 的所有列都將其可空性設置爲NOT NULL。

+0

那麼我怎麼去設計它的模型,我使用註釋,到目前爲止只用[Key]來定義主鍵,如果我不這樣做那我還能做什麼? – ChaoticLoki

2

嗯,它們非常相似,但這裏有差異。

表中只允許有一個主鍵,但可以添加多個唯一索引,直到該表的最大允許索引數(SQL Server = 250(1 x集羣,249 x非集羣)和SQL 2008和SQL 2012 = 1000(1個集羣,999個非集羣))。主鍵不能包含可爲空的列,但唯一索引可以。請注意,只允許一個NULL。如果索引是跨多個列創建的,則值和NULL的每個組合都必須是唯一的。

默認情況下,除非您在create語句中另行指定,並且規定聚集索引尚不存在,否則將主鍵創建爲聚簇索引。但是,唯一索引默認情況下會創建爲非聚簇索引,除非您另行指定並且提供聚簇索引尚不存在。

下面的鏈接將真正幫助you.just去用它

HERE

1

是,複合材料和獨特的關鍵,就像你在這裏,會給你一個指標非常喜歡的主鍵。這些優點之一是數據包含在索引中,因此如果僅查詢密鑰中的字段,則不必在表中進行查找。

這在Entity Framework中也是可能的。它會像這樣。

public class AT_APSRANCD 
{ 
    [Column(Order = 0), Key, ForeignKey("AC_Analysis_category")] 
    public int AC_Analysis_category{ get; set; } 

    [Column(Order = 1), Key, ForeignKey("AC_ANALYSI_CODE")] 
    public int AC_ANALYSI_CODE{ get; set; } 
} 
+0

這不就是創建一個複合主鍵嗎? – ChaoticLoki

3

它們當然不是一回事。

主鍵必須是唯一的,但這只是其中的一個要求。另一個將是它不能爲空,這不需要一個唯一的約束。

另外,雖然在某種程度上,可以將獨特的約束條件用作窮人的主鍵,但與IGNORE_DUP_KEY = ON一起使用它們顯然是錯誤的。該設置意味着如果您嘗試插入重複項,則插入操作將失敗。

0

主鍵不包含任何空值。

但是如果有唯一的空值可以插入表中。

任意數量值的可插入主鍵PRIMARY_KEY的

定義= UNIQUE + NOT_NULL

+0

對不起,但這比這更復雜。 – Szymon

4

他們是絕對不同的。正如在其他的答案中提到:

  • 唯一密鑰只是用來測試的獨特性,沒有別的
  • 主鍵充當記錄的標識符。

此外,重要的是主鍵通常是聚簇索引。這意味着記錄按照主鍵定義的順序物理存儲。這對性能有很大的影響。

此外,聚簇索引鍵(通常也是主鍵)會自動包含在所有其他索引中,因此獲取它不需要記錄查找,只需讀取索引就足夠了。總結一下,一定要確保你的表有一個主鍵。索引對性能有很大的影響,你希望確保你的索引正確。

+1

這不完全正確。它是所有其他非聚簇索引中使用的聚簇索引鍵。通常,聚集索引也是PK,但這並不總是如此。 –

+0

@Silas漢森沒錯。我更新了我的答案,謝謝。 – Szymon

相關問題