【问题标题】:How do I obtain information about a nullable foreign key from Information_Schema views?如何从 Information_Schema 视图中获取有关可为空的外键的信息?
【发布时间】:2009-07-28 11:46:44
【问题描述】:

我正在使用 Sql Server 2005 和 2008 中的 INFORMATION_SCHEMA 视图来获取数据库的元数据:

SELECT
    PK.TABLE_NAME as 'PK_TABLE_NAME',
    FK.TABLE_NAME as 'FK_TABLE_NAME',
    C.CONSTRAINT_NAME as 'CONSTRAINT_NAME'
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
    JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
    JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
WHERE
    FK.TABLE_NAME = 'Table_Name' 

但是,如果我的表上有一个可为空的外键,则它不会包含在我的结果中,因为“UNIQUE_CONSTRAINT_NAME”列没有匹配的条目。

我正在努力研究如何使用 INFORMATION_SCHEMA 架构中的视图获取有关可为空的外键(特别是引用的表和列的名称)的信息。显然索引不是标准的一部分,因此aren't included in the views

有谁知道我可以如何更改查询以获取有关可为空的外键的信息?

编辑

顺便说一句,SQL Server Compact Edition has an INFORMATION_SCHEMA.INDEXES view - 为什么 CE 会得到这些有用的信息?!

【问题讨论】:

    标签: sql-server foreign-keys metadata nullable


    【解决方案1】:

    我看过了,它不是可为空的 FK,而是 FK 指向唯一索引而不是唯一约束/主键的地方。

    即使两者都作为索引实现,唯一索引也不会出现在 TABLE_CONSTRAINTS 中

    没有“INFORMATION_SCHEMA.INDEXES”。

    因此,选择是使用“sys”视图...

    编辑:对丢失的位使用 sys.indexes。而且我不知道为什么 SQL CE 有视图...

    SELECT
        ISNULL(PK.TABLE_NAME, OBJECT_NAME(I.[object_id])) as 'PK_TABLE_NAME',
        FK.TABLE_NAME as 'FK_TABLE_NAME',
        C.CONSTRAINT_NAME as 'CONSTRAINT_NAME'
    FROM
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
        JOIN
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
        LEFT JOIN
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
        LEFT JOIN
        sys.indexes I ON C.UNIQUE_CONSTRAINT_NAME = I.[name]
    

    【讨论】:

    • 嗯,我当时就猜到了。不幸的是,“系统”视图的布局更加难以理解。更多令人头疼的事情 - 感谢您的意见。
    【解决方案2】:

    随便看看 sp_helpconstraint

    的源代码

    在管理工作室中,进入:

      Databases  
        System Databases  
          master  
            Programmability  
              Stored Procedures  
                System Stored Procedures  
                  sp_helpconstraint
    

    您可以确切地看到 Microsoft 是如何做到这一点的。您可以查看其他系统存储过程,这些过程将“向您展示”如何获取表元数据....

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 2011-04-21
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      相关资源
      最近更新 更多