代码之家  ›  专栏  ›  技术社区  ›  Abe Miessler

如何找到所有外键?

  •  3
  • Abe Miessler  · 技术社区  · 14 年前

    我想在我的数据库中找到所有有外键指向特定引用表的引用表。有没有我可以运行的查询来执行此操作?

    不确定这个问题是否令人困惑。如果是,请告诉我,我可以试着详细解释。

    4 回复  |  直到 14 年前
        1
  •  2
  •   josephj1989    14 年前

    以下查询或修改tehreof将在Sql server中执行 您还可以提供目录和模式信息

    select tab1.TABLE_NAME from 
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as ref inner join
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS as prim
    on ref.UNIQUE_CONSTRAINT_NAME=prim.CONSTRAINT_NAME
    and ref.UNIQUE_CONSTRAINT_CATALOG=prim.CONSTRAINT_CATALOG
    and ref.UNIQUE_CONSTRAINT_SCHEMA=prim.CONSTRAINT_SCHEMA
    --and prim.CONSTRAINT_TYPE in('PRIMARY KEY','UNIQUE')
    inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tab1 on
    ref.CONSTRAINT_NAME=tab1.CONSTRAINT_NAME
    and ref.CONSTRAINT_CATALOG=tab1.CONSTRAINT_CATALOG
    and ref.CONSTRAINT_SCHEMA=tab1.CONSTRAINT_SCHEMA
    where prim.TABLE_NAME='YourTablename'
    
        2
  •  2
  •   Rodrick Chapman    14 年前

    前段时间我也有类似的问题。下面是我使用Sql Server SMO编写的脚本:

        public static string GetForeignKeyScript()
        {
            SqlConnection conn = new System.Data.SqlClient.SqlConnection("SOME_CONNECTION_STRING");
            Server server = new Server(new ServerConnection(conn));
            Database db = server.Databases["SOME_DATABASE"];
            Table Roles = db.Tables["SOME_TABLE"];
    
            var sb = new StringBuilder();
    
            foreach (Table table in db.Tables)
                foreach (ForeignKey fk in table.ForeignKeys)
                        foreach (string s in fk.Script())
                            sb.AppendLine(s);
    
            return sb.ToString();
        }
    

    这将输出一个字符串,其中包含用于创建外键的脚本。

        3
  •  0
  •   Cade Roux    14 年前

    看看元数据:

    SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
    SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
    SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    
        4
  •  0
  •   thkala jaxb    13 年前
    SELECT  DISTINCT
                 ParentSchema.name      ParentSchema
                ,ParentTable.name       ParentTable
                ,ChildSchema.name       ChildSchema
                ,ChildTable.name        ChildTable
        FROM sys.foreign_keys       Foreign_Keys
        JOIN sys.objects            ParentTable     ON  Foreign_Keys.parent_object_id       =   ParentTable.object_id
        JOIN sys.schemas            ParentSchema    ON  ParentTable.schema_id               =   ParentSchema.schema_id
        JOIN sys.objects            ChildTable      ON  Foreign_Keys.referenced_object_id   =   ChildTable.object_id
        JOIN sys.schemas            ChildSchema     ON  ChildTable.schema_id                =   ChildSchema.schema_id
        WHERE ParentSchema.name = '??????'
          AND ParentTable.name = '??????'