全,
此页特别讨论从表中删除外键的问题。在“示例”部分,Example D展示了如何删除外键。
问题是,该示例使用了命名外键约束,在这种情况下,语法非常简单。
但是,Server在使用外键创建表时不需要约束名称。
所以,我很好奇--在MSDN的某个地方,是否有一个例子显示了如何删除未命名的外键约束?那么,为什么我提到的页面没有提供这样的例子呢?
蒂娅!
发布于 2018-04-25 17:44:40
没有这样的语句,因为DROP CONSTRAINT选项要求您为要删除的约束命名。所以,不,我不希望它出现在MSDN上。
虽然您可以创建一个约束而不显式地命名它,但它仍然有一个名称。这只是一种允许的方便,大概是因为大多数时候您都会创建一个约束,以后不需要知道或关心名称是什么。通常,让系统给约束命名是错误的做法,但#temp表上的某些类型的约束除外(由于并发冲突)。
我怀疑现在仍然允许使用语法来防止向后兼容性问题,而不是因为这是个好主意。事实上,如果我负责MSDN文档,我不会描述下面删除一个未命名约束的方法,因为它所做的只是鼓励这种不良做法继续下去。
无论如何,要在不知道名称时删除约束,您需要手动查找它(包含所涉及的表和列的名称),或者使用动态SQL。下面是后者的一个不完整但行之有效的例子:
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。如果您命名约束,而不是让系统命名它们,这应该会变得容易得多。
https://dba.stackexchange.com/questions/204943
复制相似问题