2009-09-09 40 views
31

這是我問here的一個後續問題。在數據庫中可以使用同一個名稱嗎?

DB中的約束是否可以具有相同的名稱?

說我有:

CREATE TABLE Employer 
(
    EmployerCode VARCHAR(20) PRIMARY KEY, 
    Address   VARCHAR(100) NULL 
) 


CREATE TABLE Employee 
(
    EmployeeID  INT   PRIMARY KEY, 
    EmployerCode VARCHAR(20) NOT NULL, 
    CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer 
) 


CREATE TABLE BankAccount 
(
    BankAccountID INT   PRIMARY KEY, 
    EmployerCode VARCHAR(20) NOT NULL, 
    Amount   MONEY   NOT NULL, 
    CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer 
) 

這是允許的?它依賴於DBMS(我在SQL Server 2005上)?如果這是不允許的,有沒有人有任何建議如何解決它?

回答

37

否 - 約束也是一個數據庫對象,因此它的名稱必須是唯一的。

嘗試添加例如表名稱與您的約束條件,這將是唯一的。

CREATE TABLE BankAccount 
(
    BankAccountID INT   PRIMARY KEY, 
    EmployerCode VARCHAR(20) NOT NULL, 
    Amount   MONEY   NOT NULL, 
    CONSTRAINT FK_BankAccount_Employer 
     FOREIGN KEY (EmployerCode) REFERENCES Employer 
) 

我們基本上是用 「FK _」(子表)_(父表)」來命名的約束和與此命名約定非常高興。從MSDN

信息約束名稱必須對模式唯一(即同一數據庫中的兩個不同模式都可以包含一個具有相同名稱的約束)並沒有明確記錄,而是需要假定數據庫對象的標識符必須在包含除非另有說明,否則模式erwise。所以約束名稱爲defined爲:

是約束的名稱。約束名稱必須遵循標識符的規則,但名稱不能以數字符號(#)開頭。如果未提供constraint_name,則將系統生成的名稱分配給該約束。

比較這對一個index名稱:

是索引的名稱。索引名稱在表或視圖中必須是唯一的,但在數據庫中不必是唯一的。索引名稱必須遵循標識符的規則。

它明確地縮小了標識符的範圍。

+0

+1:我們使用了使表名作爲前綴的單詞的第一個字母。 – 2009-09-09 05:21:50

7

我總是感到困惑爲什麼約束名稱在數據庫中必須是唯一的,因爲它們好像與表關聯。

然後我讀了關於SQL-99的ASSERTION約束,這就像一個檢查約束,但存在於任何單個表之外。在斷言中聲明的條件必須像任何其他約束一致地得到滿足,但斷言可以引用多個表。

AFAIK沒有SQL供應商實現ASSERTION約束。但這有助於解釋爲什麼約束名稱在數據庫範圍內是數據庫範圍。

+1

好吧,即使斷言約束沒有被執行:你是否會希望通過同一個名字有三個外鍵約束?如果你得到FK違規錯誤,說明FK的名稱 - 你怎麼知道它真的是三個中的哪一個?我認爲強制使用唯一約束名稱是一件好事(tm):-) – 2009-09-09 20:50:32

+0

是的,當然。我提到「這是ANSI SQL標準」,但您的觀點更實用。 – 2009-09-09 21:08:49

0

好的做法是在開始時創建指定表名稱的索引和約束名稱。 有兩種方法,在開始或結束時使用索引/約束類型),例如。

UQ_TableName_FieldName 

TableName_FieldName_UQ 

外鍵的名稱還應該包含引用表/場(S)的名字。

良好的命名約定之一是以FullName_3LetterUniqueAlias形式給出表名。

Employers_EMR 
Employees_EMP 
BankAccounts_BNA 
Banks_BNK 

這給你機會,利用「預定」的別名,其中提高了可讀性,也查詢使外鍵的命名更容易,如:

EMPEMR_EmployerCode_FK 
BNKEMR_EmployerCode_FK 
16

其他的答案都不錯,但我想我倒是回答的稱號增加的問題,即‘能有相同名稱的限制在DB?’

MS SQL Server的答案是肯定的 - 但只要約束在不同的sch EMAS。在模式中約束名稱必須是唯一。

1

是否依賴於DBMS(我在SQL Server 2005上)?

是的,顯然它確實取決於數據庫管理系統。

其他答案說這是不允許的,但我有一個MS SQL CE(「精簡版」)數據庫,其中我意外地成功創建兩個FK約束,在兩個表中,具有相同的約束名稱。

0

它取決於DBMS。

例如在PostgreSQL的,答案是

因爲PostgreSQL不需要約束名稱是一個架構中是唯一的 (但只有每個表),它是可能的對於指定的約束名稱,存在多個匹配項的 。

來源:https://www.postgresql.org/docs/current/static/sql-set-constraints.html

我見過的外鍵約束名稱等於在同一架構中2個不同的表。

相關問題