1

当我尝试运行我的应用程序时,我收到以下错误:

There is already an object named 'PK_***' in the database. Could not create constraint."

为简洁起见,这实际上是两个错误的组合。注意: 星号是我自己的;这不是密钥的实际名称。

我已经搜索了这里的每个帖子,但我似乎无法进一步找到解决方案。最糟糕的部分?团队中没有其他人在运行时遇到这些错误,他们也无法确定我为什么会这样。我们都使用相同的环境,VS 2012 Premium RC。我当然有来自 TFS 的最新消息。

我想知道是否有其他人遇到过与此类似的问题,即问题/错误仅发生在一个人的环境中?我可以继续并运行该应用程序。它似乎按预期运行,但我是唯一遇到这些错误的人。

4

1 回答 1

6

在 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 标准的工作方式。

祝你好运!

于 2012-08-08T18:40:08.833 回答