【问题标题】:List one to one foreign key relationships列出一对一的外键关系
【发布时间】:2017-02-01 13:28:16
【问题描述】:

由于我们数据库的重构,我希望重命名数据库中的一些外键。我们要应用的外键名称的格式因关系的基数而异(目前我们只有 1-n 和 1-1)。

我想识别所有 1-1 外键关系,以便我对它们应用不同的命名模板。我不知道如何实现这一点。到目前为止,我只能列出与此查询的所有外键关系:

SELECT RC.CONSTRAINT_NAME FK_Name
, KP.TABLE_NAME PK_Table
, KF.TABLE_NAME FK_Table
, KP.COLUMN_NAME PK_Column
, KF.COLUMN_NAME FK_Column
, RC.UNIQUE_CONSTRAINT_NAME PK_Name
, KP.TABLE_SCHEMA PK_Schema
, RC.MATCH_OPTION MatchOption
, RC.UPDATE_RULE UpdateRule
, RC.DELETE_RULE DeleteRule
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME

SSMS 显然可以提取这些数据,因为在图表查看器中它以不同的方式显示两种类型的关系(在连接线的两端都有一个键)。

感谢任何帮助。

【问题讨论】:

    标签: sql sql-server database relational-database


    【解决方案1】:

    我相信我在 sqlmetal 用来生成映射的查询的帮助下找到了它:

    select RC.CONSTRAINT_NAME FK_Name
    , KP.TABLE_NAME PK_Table
    , KF.TABLE_NAME FK_Table
    , KP.COLUMN_NAME PK_Column
    , KF.COLUMN_NAME FK_Column
    , RC.UNIQUE_CONSTRAINT_NAME PK_Name
    , KP.TABLE_SCHEMA PK_Schema
    , RC.MATCH_OPTION MatchOption
    , RC.UPDATE_RULE UpdateRule
    , RC.DELETE_RULE DeleteRule
    from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
    join INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME
    join INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME
    where KF.TABLE_NAME + '.' + KF.COLUMN_NAME in
    (
        select t.name + '.' + c.name
        from sys.indexes as x,
            sys.index_columns as ic,
            sys.columns as c,
            sys.tables as t,
            sys.schemas as s
        where x.object_id = ic.object_id and
              x.index_id = ic.index_id and
              x.object_id = c.object_id and
              ic.column_id = c.column_id and
              c.object_id = t.object_id and
              t.schema_id = s.schema_id and
              ISNULL(OBJECTPROPERTY(t.object_id, 'IsMSShipped'), 0) = 0 and
              x.is_unique = 1 and
             (
                select count(*) 
                from sys.index_columns ic2
                where ic2.object_id = ic.object_id and
                      ic2.index_id = ic.index_id and
                      ISNULL(OBJECTPROPERTY(ic2.object_id, 'IsMSShipped'), 0) = 0
             ) = 1
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-08
      • 2015-02-14
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多