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,则会为约束分配系统生成的名称.
将其与索引的名称进行比较:
是索引的名称.索引名称在表或视图中必须是唯一的,但在数据库中不必是唯一的.索引名称必须遵循标识符规则.
它明确地缩小了标识符的范围.
Ant*_*ica 24
其他答案都很好,但我想我会在标题中添加一个问题的答案,即" 数据库中是否存在具有相同名称的约束? "
MS SQL Server的答案是肯定的 - 但只要约束在不同的模式中.约束名称在模式中必须是唯一的.
Bil*_*win 10
我一直很困惑为什么约束名在数据库中必须是唯一的,因为它们看起来像是与表相关联.
然后我读到了SQL-99的ASSERTION约束,它类似于检查约束,但是除了任何单个表之外都存在.断言中声明的条件必须像任何其他约束一样得到满足,但断言可以引用多个表.
AFAIK没有SQL供应商实现ASSERTION约束.但这有助于解释为什么约束名称在数据库范围内.
这取决于 DBMS。
例如在PostgreSQL 上,答案是肯定的:
由于 PostgreSQL 不要求约束名称在模式中是唯一的(但仅针对每个表),因此指定的约束名称可能有多个匹配项。
来源:https : //www.postgresql.org/docs/current/static/sql-set-constraints.html
我已经看到外键约束名称等于同一架构中的 2 个不同表。
| 归档时间: |
|
| 查看次数: |
22974 次 |
| 最近记录: |