1

我在部署 Visual Studio SQL Server DBProject 时收到此错误

DBProj.dbschema(0,0):警告 SQL01271:将通过检查表来检查表 [dbo].[Match] 和 [dbo].[Team] 之间的未命名外键。命名外键以避免检查整个表,只检查新约束。

我的表定义是

CREATE TABLE [dbo].[Match]
(
    MatchID         int identity(11,2) PRIMARY KEY, 
    TournamentID    int not null REFERENCES Tournament(TournamentID),
    Team1_ID        int not null REFERENCES Team(TeamID),
    Team2_ID        int not null REFERENCES Team(TeamID),
    MatchDate       date,
    MatchTime       time
)

CREATE TABLE [dbo].[Team]
(
    TeamID    int PRIMARY KEY,
    TeamName  varchar(50)
)

更新: 未命名的约束

如果不指定名称,SQL 将生成一个随机名称,该名称由表示约束类型的前缀、部分表和列名称后跟随机字母数字字符串构建。它通常看起来像这样:DF_ MyTable _MyColu__3F3159AB

每次重建和部署 DBProject 时,都会重复此过程,生成一组新的随机约束名称

这个错误是什么意思?这意味着什么?特别是,命名外键以避免检查整个表而只检查新约束。

4

1 回答 1

4

摘要:最好的做法是始终命名约束

对我来说,关于这个问题的信息很难获得。到目前为止,我已经能够找到一些关于约束的新信息,我可以说我学到了更多。

在 dba.SE.com 上发布同样的问题,我得到了这个回复

如何在 SQL Server 中删除未命名的约束

如果不指定名称,SQL 将生成一个随机名称,该名称由表示约束类型的前缀、部分表和列名称后跟随机字母数字字符串构建。它通常看起来像这样:

DF__MyTable__MyColu__3F3159AB

.

使用“垃圾”名称部分清理DRI 对象中的SQL Server 部署脚本

例如,如果创建了主键但未命名,则 SQL Server 使用默认的自动生成名称 PK__TableName__Junk(例如,PK__Customer__A4AE64082CE326F2)。这将导致 SQL Compare 删除主键并重新创建它,因为其名称的 Junk 部分在不同的数据库中会有所不同。

这意味着即使没有功能更改,使用比较软件生成的任何更改脚本都会在每次新构建时尝试删除“旧”约束并添加“新”约束。在表上删除和重新创建主键可能是一项非常昂贵的操作,并且由于没有功能更改,我们可以很好地生活没有。

.

Dan Jones 博客最佳实践:命名约束

底线是不要做一个懒惰的 DBA/程序员,让系统命名你的约束。从长远来看,在键盘上多敲几下是值得的。

事实上,这可能会成为我标准 DBA 面试问题库的一部分:你说出你的限制条件吗?或类似的东西。

于 2012-08-21T20:54:58.960 回答