【问题标题】:Query to get all foreign key constraints in SQL Server 2000查询以获取 SQL Server 2000 中的所有外键约束
【发布时间】:2010-10-24 07:31:52
【问题描述】:

我需要查询 SQL Server 2000 以获取所有外键的列表。

尤其是指向特定列的所有外键。

如何编写此查询?

【问题讨论】:

    标签: sql-server-2000 foreign-keys


    【解决方案1】:
    select * from sysobjects
    where xtype = 'F'
    

    我希望这样可以解决问题并与 SQL Server 2000 兼容!

    如果您还需要 SQL Server 2000 中的表和列信息,则涉及更多;您需要像这样加入sysforeignkeyssyscolumns 目录视图:

    select
      so.name 'foreign key name',
      OBJECT_NAME(parent_obj) 'table',
      OBJECT_NAME(sf.fkeyid) 'referencing table',
      sc1.name 'referencing column',
      OBJECT_NAME(sf.rkeyid) 'referenced table',
      sc2.name 'referenced column'
    from sysobjects so
    inner join sysforeignkeys sf on so.id = sf.constid
    inner join syscolumns sc1 on sf.fkeyid = sc1.id and sf.fkey = sc1.colid
    inner join syscolumns sc2 on sf.rkeyid = sc2.id and sf.fkey = sc2.colid
    where so.xtype in ('F','PK')
    

    如果您想利用在 SQL Server 2000 中确实可用的 INFORMATION_SCHEMA 视图,请使用以下查询:

    SELECT
        rc.CONSTRAINT_NAME,     
        rcu.TABLE_NAME 'Referencing Table', 
        rcu.COLUMN_NAME 'Referencing Column',
        rcu1.TABLE_NAME 'Referenced Table',
        rcu1.COLUMN_NAME 'Referenced Column'
    FROM
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
    INNER JOIN 
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu 
          ON rc.CONSTRAINT_CATALOG = rcu.CONSTRAINT_CATALOG 
             AND rc.CONSTRAINT_NAME = rcu.CONSTRAINT_NAME
    INNER JOIN 
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu1 
          ON rc.UNIQUE_CONSTRAINT_CATALOG = rcu1.CONSTRAINT_CATALOG 
             AND rc.UNIQUE_CONSTRAINT_NAME = rcu1.CONSTRAINT_NAME
    

    马克

    【讨论】:

    • 第二个查询似乎有点奇怪。它似乎缺少某种连接条件 - 我得到了一些笛卡尔积。
    • 您实际上需要加入sf.fkeyid = sc1.id and sf.fkey = sc1.colid(rkey 也是如此)
    • 你可能还想使用so.xtype in ('F', 'PK')
    • 这正是我正在寻找的解决方案。谢谢
    • 引用的列应该是用and sf.rkey = sc2.colid而不是and sf.fkey = sc2.colid连接
    【解决方案2】:
    select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
    

    如果您需要有关键的更多信息,可以将其加入到 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 视图中,该视图包含键所引用的列。

    【讨论】:

    • 我认为 INFORMATION_SCHEMA 在 SQL Server 2000 中不可用.....(我认为这是 2005 年的新功能,不是吗?)
    • 没有。它是可用的。在发布之前,我根据 SQL 2000 实例对其进行了检查。
    • 如何过滤列?
    【解决方案3】:

    查看 sp_helpconstraint 的来源以获得更多想法,但这应该可行...

    获取每个引用目标表和列的 FK

    • 替换“你的表名”
    • 取消注释最后一个“AND”并设置您的目标列名称

    代码:

    --list all tables & columns that refer to the given table
    select
        k.name,pt.Name AS ParentTable,pc.name,c.constraint_column_id,ct.Name AS ReferedToTable,c.referenced_column_id,cc.Name
        from sys.foreign_keys                  k
            INNER JOIN sys.foreign_key_columns c ON k.parent_object_id=c.parent_object_id
            INNER JOIN sys.objects             pt ON c.parent_object_id=pt.object_ID
            INNER JOIN sys.objects             ct ON c.referenced_object_id=ct.object_ID
            INNER JOIN  sys.columns            pc ON c.parent_object_id=pc.object_ID AND c.parent_column_id=pc.column_id
            INNER JOIN  sys.columns            cc ON c.referenced_object_id=cc.object_ID AND c.referenced_column_id=cc.column_id
        where k.referenced_object_id = object_id('YourTableName')
            --AND pc.name='YourColumnName' --parent table column name
            --AND cc.name='YourColumnName' --referenced table's column name
    

    【讨论】:

    • 再次 - SQL Server 2000 中 提供“sys”架构......这在 2005 年和 2008 年工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2017-06-17
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多