首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >放下外键

问放下外键
EN

Database Administration用户
提问于 2018-04-25 17:36:59
回答 1查看 250关注 0票数 -1

全,

此页特别讨论从表中删除外键的问题。在“示例”部分,Example D展示了如何删除外键。

问题是,该示例使用了命名外键约束,在这种情况下,语法非常简单。

但是,Server在使用外键创建表时不需要约束名称。

所以,我很好奇--在MSDN的某个地方,是否有一个例子显示了如何删除未命名的外键约束?那么,为什么我提到的页面没有提供这样的例子呢?

蒂娅!

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-04-25 17:44:40

没有这样的语句,因为DROP CONSTRAINT选项要求您为要删除的约束命名。所以,不,我不希望它出现在MSDN上。

虽然您可以创建一个约束而不显式地命名它,但它仍然有一个名称。这只是一种允许的方便,大概是因为大多数时候您都会创建一个约束,以后不需要知道或关心名称是什么。通常,让系统给约束命名是错误的做法,但#temp表上的某些类型的约束除外(由于并发冲突)。

我怀疑现在仍然允许使用语法来防止向后兼容性问题,而不是因为这是个好主意。事实上,如果我负责MSDN文档,我不会描述下面删除一个未命名约束的方法,因为它所做的只是鼓励这种不良做法继续下去。

无论如何,要在不知道名称时删除约束,您需要手动查找它(包含所涉及的表和列的名称),或者使用动态SQL。下面是后者的一个不完整但行之有效的例子:

代码语言:javascript
复制
DECLARE @fkname sysname;

SELECT @fkname = fk.name FROM sys.foreign_keys AS fk
  INNER JOIN sys.objects AS parent
  ON fk.referenced_object_id = parent.object_id
  INNER JOIN sys.objects AS child
  ON child.object_id = fk.parent_object_id /* parent of FK, not of child row */
  WHERE parent.name = N'Parent table'
    AND child.name = N'Child table';

-- best practice: also join twice to sys.schemas to ensure proper schema, too

DECLARE @sql nvarchar(max) = N'ALTER TABLE dbo.[Child Table]
  DROP CONSTRAINT ' + QUOTENAME(@fkname) + N';';

PRINT @sql;

-- EXEC sys.sp_executesql @sql;

您还可以在相同的两个表之间有多个外键(甚至FKs指向同一个表),因此您可能需要其他过滤器来确保删除正确的FK。如果您命名约束,而不是让系统命名它们,这应该会变得容易得多。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/204943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档