2009-09-09 88 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个不同的表。

相关问题