数据库中是否存在具有相同名称的约束?

And*_*rew 47 sql t-sql sql-server sql-server-2005 constraints

这是我在这里问到的一个后续问题.

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
)
Run Code Online (Sandbox Code Playgroud)

这是允许的吗?它取决于DBMS(我在SQL Server 2005上)吗?如果不允许,是否有人对如何解决它有任何建议?

mar*_*c_s 53

否 - 约束也是数据库对象,因此其名称必须是唯一的.

尝试将表格名称添加到约束中,这样它就是唯一的.

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
)
Run Code Online (Sandbox Code Playgroud)

我们基本上使用"FK _"(子表)_(父表)来命名约束,并对这个命名约定非常满意.

来自MSDN的信息

该约束名称必须对于模式是唯一的(即,同一数据库中的两个不同模式都可以包含具有相同名称的约束)未明确记录.相反,除非另有说明,否则您需要假设数据库对象的标识符在包含的模式中必须是唯一的.因此约束名称定义为:

是约束的名称.约束名称必须遵循标识符规则,但名称不能以数字符号(#)开头.如果未提供constraint_name,则会为约束分配系统生成的名称.

将其与索引的名称进行比较:

是索引的名称.索引名称在表或视图中必须是唯一的,但在数据库中不必是唯一的.索引名称必须遵循标识符规则.

它明确地缩小了标识符的范围.

  • 这只是部分正确,因为必须在模式级别而不是数据库级别强制唯一性。请参阅[下面的答案](/sf/answers/1388267961/)。 (3认同)

Ant*_*ica 24

其他答案都很好,但我想我会在标题中添加一个问题的答案,即" 数据库中是否存在具有相同名称的约束? "

MS SQL Server的答案是肯定的 - 但只要约束在不同的模式中.约束名称在模式中必须是唯一的.


Bil*_*win 10

我一直很困惑为什么约束名在数据库中必须是唯一的,因为它们看起来像是与表相关联.

然后我读到了SQL-99的ASSERTION约束,它类似于检查约束,但是除了任何单个表之外都存在.断言中声明的条件必须像任何其他约束一样得到满足,但断言可以引用多个表.

AFAIK没有SQL供应商实现ASSERTION约束.但这有助于解释为什么约束名称在数据库范围内.

  • @marc_s 如果约束名称是表范围的,则错误消息也将包含表名称。例如,Postgres 就是这么做的。 (2认同)

Gui*_*sta 6

这取决于 DBMS。

例如在PostgreSQL 上,答案是肯定的

由于 PostgreSQL 不要求约束名称在模式中是唯一的(但仅针对每个表),因此指定的约束名称可能有多个匹配项。

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

我已经看到外键约束名称等于同一架构中的 2 个不同表。