如何使用 INFORMATION_SCHEMA 找到默认约束?

新手上路,请多包涵

我正在尝试测试是否存在给定的默认约束。我不想使用 sysobjects 表,而是更标准的 INFORMATION_SCHEMA。

我以前用它来检查表和主键约束,但我在任何地方都看不到默认约束。

他们不在那里吗? (我使用的是 MS SQL Server 2000)。

编辑:我正在寻找约束的名称。

原文由 WildJoe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 334
2 个回答

据我了解,默认值约束不是 ISO 标准的一部分,因此它们不会出现在 INFORMATION_SCHEMA 中。 INFORMATION_SCHEMA 似乎是此类任务的最佳选择,因为它是跨平台的,但如果信息不可用,则应使用对象目录视图 (sys.*) 而不是 SQL Server 中已弃用的系统表视图2005 年及以后。

以下与@user186476 的答案几乎相同。它返回给定列的默认值约束的名称。 (对于非 SQL Server 用户,您需要默认名称才能删除它,如果您自己不命名默认约束,SQL Server 会创建一些疯狂的名称,例如“DF_TableN_Colum_95AFE4B5”。为了更容易更改您将来的架构,始终明确命名您的约束!)

 -- returns name of a column's default value constraint
SELECT
    default_constraints.name
FROM
    sys.all_columns

        INNER JOIN
    sys.tables
        ON all_columns.object_id = tables.object_id

        INNER JOIN
    sys.schemas
        ON tables.schema_id = schemas.schema_id

        INNER JOIN
    sys.default_constraints
        ON all_columns.default_object_id = default_constraints.object_id

WHERE
        schemas.name = 'dbo'
    AND tables.name = 'tablename'
    AND all_columns.name = 'columnname'

原文由 Robert Calhoun 发布,翻译遵循 CC BY-SA 3.0 许可协议

例如,如果目标数据库有超过 1M 的对象,则使用 sys.default_constraints 可以在扫描 sys.syscolpars 之后对 dflt 449af8933a81a0fb9ff240852c-7 进行 90%+ 的键查找 --- 你可能不在乎。在我的数据库上,从实际扫描的 158 次读取的 剩余 I/O 受损 1.12MM 行中仅组装 4 行需要 1.129 秒。

更改为使用当前的 sys.% 表/视图,使用 @Tim 的查询,在 2ms 内获得相同的 4 个约束。希望有人发现这和我发现蒂姆的一样有用:

 SELECT ConstraintName = sdc.name
     , SchemaName     = ssch.name
     , TableName      = stab.name
     , ColumnName     = scol.name
  FROM sys.objects            sdc
       INNER JOIN sys.columns scol
               ON scol.default_object_id = sdc.object_id
       INNER JOIN sys.objects stab
               ON stab.object_id         = scol.object_id
       INNER JOIN sys.schemas ssch
               ON ssch.schema_id         = stab.schema_id;

原文由 SAinCA 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进