在 SQL Server 中,诸如主键或外键之类的约束本身就是对象,即使它们依赖于“包含”表。
这意味着它们的名称在所属模式中必须是唯一的。因此,就像按照以下方式执行 DDL
create table some_schema.foo
(
id int not null
)
go
create table some_schema.foo
(
id int not null
)
go
当第二个create table
被[试图]执行时会引发错误,像这样执行 ddl 同样会引发错误:
create table some_schema.foo
(
id int not null ,
description varchar(200) not null ,
constraint PK primary key clustered ( id ) ,
constraint AK01 unique nonclustered ( description ) ,
)
go
create table some_schema.bar
(
id int not null ,
description varchar(200) not null ,
constraint PK primary key clustered ( id ) ,
constraint AK01 unique nonclustered ( description ) ,
)
go
同样会引发错误,因为您尝试创建的约束具有重复的名称。您需要使用表名来限定它们,因此:
create table some_schema.foo
(
id int not null ,
description varchar(200) not null ,
constraint foo_PK primary key clustered ( id ) ,
constraint foo_AK01 unique nonclustered ( description ) ,
)
go
create table some_schema.bar
(
id int not null ,
description varchar(200) not null ,
constraint bar_PK primary key clustered ( id ) ,
constraint bar_AK01 unique nonclustered ( description ) ,
)
go
你的问题就会消失。
在我看来,在欠对象的上下文之外不存在的依赖对象应该在拥有对象的范围内命名空间,但这不是 SQL 标准的工作方式。
祝你好运!