为什么更改表并添加外键会创建额外的约束?

hvi*_*ard 5 foreign-key sql-server sql-server-2008-r2 alter-table

编辑:这是一个默认约束,因为在添加列时设置了默认值。当以“DF__”开头时,这个名字就泄露了它。无论如何,通过添加列并手动命名约束来解决它。

ALTER TABLE MyTable ADD [FooId] [int] NOT NULL CONSTRAINT DF_MyTable_FooId DEFAULT 0
Run Code Online (Sandbox Code Playgroud)

现在我可以轻松删除约束并删除列。


出于测试目的,我需要经常删除并重新创建一些表。我正在使用 MS-Sql 服务器 2008 r2。

当我创建表时,我还在现有表中创建了一个外键(我不能直接删除):

ALTER TABLE MyTable
ADD CONSTRAINT FK_MyTable_NewTable
FOREIGN KEY (FooId) REFERENCES NewTable (Id)
Run Code Online (Sandbox Code Playgroud)

这确实正确创建了外键,但它还添加了一个带有系统生成名称的约束(类似于 DF__MyTable_FooId__53385258),如果在 CREATE TABLE 语句中定义了外键,则不会创建。

我的问题是,当我想删除 MyTable 时,我必须删除外键约束 - 这很容易,因为我命名了它,但是另一个系统生成的约束仍然存在,我没有直接删除的方法它。

是否可以在系统不生成第二个(我假设是冗余的)约束的情况下将外键添加到现有表中?

And*_*y M 5

我认为像您这样的 DDL 语句可能会导致“额外”约束的唯一方法是当有一个 DDL 触发器创建该约束以响应您的 DDL 语句时。如果您的数据库不是这种情况,则所述额外约束肯定是与创建外键的语句无关的完全不同语句的结果。

它可能出现在较早的阶段(例如,在创建表时),或者它可能是由在与您的帖子中的脚本相同的脚本中执行的语句添加的,并且该事实由于某种原因没有注册当时和你在一起。