2009-09-09 148 views
27

命名約束(唯一,主鍵,外鍵)的目的是什麼?約束命名的目的

說我有這是使用自然鍵作爲主鍵的表:

CREATE TABLE Order 
(
    LoginName  VARCHAR(50) NOT NULL, 
    ProductName  VARCHAR(50) NOT NULL, 
    NumberOrdered INT   NOT NULL, 
    OrderDateTime DATETIME  NOT NULL, 
    PRIMARY KEY(LoginName, OrderDateTime) 
); 

什麼好處(如果有的話),並命名我的PK帶來了什麼?

例如, 替換:

PRIMARY KEY(LoginName, OrderDateTime) 

有了:

CONSTRAINT Order_PK PRIMARY KEY(LoginName, OrderDateTime) 

很抱歉,如果我的數據模型是不是最好的,我是新來的!

+1

也許使用名稱來引用約束後..就像當你想刪除\編輯它? – Aziz 2009-09-09 03:57:16

回答

62

這是一些非常基本的原因。 (1)如果查詢(插入,更新,刪除)違反了約束,SQL將生成一個包含約束名稱的錯誤消息。如果約束名稱清晰且具有描述性,則錯誤消息將更易於理解;如果約束名稱是一個隨機的基於guid的名稱,則不太清楚。特別是最終用戶,誰(可以,可能)給你打電話並詢問「FK__B__B_COL1__75435199」的含義。 (2)如果將來需要修改一個約束(是的,它發生了),如果你不知道它的名字是什麼,那麼很難做到這一點。 (ALTER TABLE MyTable drop CONSTRAINT um ...)如果您從頭開始創建多個數據庫實例並使用系統生成的默認名稱,則不會匹配任何兩個名稱。 (3)如果支持你的代碼的人(又名數據庫管理員)在週日凌晨3點不得不浪費大量毫無意義的時間來處理案例(1)或案例(2),那麼他們很可能以確定代碼來自哪裏,並能夠做出相應的反應。

+1

+1涵蓋所有基地 – gbn 2009-09-09 04:58:09

4

要確定未來的約束條件(例如,您希望將來放棄它),它應該具有唯一的名稱。如果您沒有爲其指定名稱,那麼數據庫引擎可能會爲您指定一個奇怪的名稱(例如,包含隨機內容以確保唯一性)。

+0

這是否意味着命名它只是爲了讓人們更容易識別約束?換句話說,無論您是否指定一個約束,對於DBMS來說都沒有關係。你不能在代碼中使用它來達到某種目的?對不起,如果不清楚。 – Andrew 2009-09-09 04:05:35

+1

這只是一個名字。這個名字並沒有在功能上有所不同。如果你想在未來的代碼中引用它,當然這個名字很重要。這就像說,代碼中的變量名稱。 – 2009-09-09 04:07:52

+1

就像列名*一樣沒有區別。如果他們描述的是什麼(「ProductId」而不是「BJZ0_340」或「Fred」),則它們更有用。 – 2009-09-09 04:19:40

1

它可以幫助某人快速知道約束在做什麼而不必看實際的約束,因爲名字爲您提供了所有需要的信息。

因此,我知道它是否是主鍵,唯一鍵或默認鍵,以及涉及的表格和可能的列。

3

它使DBA保持高興,因此他們讓您的架構定義進入生產數據庫。

+0

哈哈...是的,我想這是最重要的原因:P – Andrew 2009-09-09 04:02:25

3

當你的代碼隨機違反了某些外鍵約束時,它肯定會在調試時節省時間以找出它是哪一個。命名它們大大簡化了調試插入和更新。

1

通過正確命名所有約束,您可以快速將特定約束與我們的數據模型相關聯。這給了我們兩個真正的優勢:

  1. 我們可以快速識別和修復任何錯誤。
  2. 我們可以可靠地修改或刪除約束。