用于检查“多对多”关系的SQL代码

时间:2012-01-10 05:37:39

标签: sql database relational

我一直在研究不停,并且只是设法找出 - 如何检查SQL中的1对多关系。我想知道是否有人可以帮我找到如何检查SQL代码中的多对多关系。数据库中的表格格式正确。

我的情景是:

  • 用户将从数据库中选择三个表。
  • 一旦选择了三个表,我需要检查这些表是否具有多对多关系。
  • 所以我需要检查用户选择的三个表是否与主键相关联,而交集表是否有两个指向其他两个表的引用键。

SELECT K_Table = FK.TABLE_NAME,
       FK_Column = CU.COLUMN_NAME,
       PK_Table = PK.TABLE_NAME,
       PK_Column = PT.COLUMN_NAME,
       Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
        ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
        ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN (SELECT i1.TABLE_NAME, 
                   i2.COLUMN_NAME
            FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
            WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY') PT 
        ON PT.TABLE_NAME = PK.TABLE_NAME
WHERE PK.TABLE_NAME = '" + ActionM2M.Table2 + "'  AND 
      FK.TABLE_NAME = '" + ActionM2M.ITableNames1 + "' AND 
      exists (SELECT K_Table = FK.TABLE_NAME,
                     FK_Column = CU.COLUMN_NAME,
                     PK_Table = PK.TABLE_NAME,
                     PK_Column = PT.COLUMN_NAME,
                     Constraint_Name = C.CONSTRAINT_NAME
              FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
              INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
                      ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
              INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
                      ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
              INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
                      ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
              INNER JOIN (SELECT i1.TABLE_NAME, i2.COLUMN_NAME
                          FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
                          INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                                  ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
                          WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY') PT
                      ON PT.TABLE_NAME = PK.TABLE_NAME
              WHERE PK.TABLE_NAME = '" + ActionM2M.Table1 + "'  AND 
                    FK.TABLE_NAME = '" + ActionM2M.ITableNames1 + "')

1 个答案:

答案 0 :(得分:0)

我不确定让用户选择这样的三个表是一个很好的UI设计,但我们暂时将它放在一边。

您没有说明您使用的是哪种语言,或者您正在使用的DBMS。因此,具体细节将会丢失。但是:

  • 有办法找出每个表的主键。这可能是ODBC或JDBC方法,或者您可以在SQL / Schema表上查询,或者您可以直接查询系统目录。
  • 同样,有办法找出每个表的外键,包括引用列和引用的表。
  • 如果以随机顺序选择三个表,则必须查看每个表的主键,以找到一个复合的表,其中包含两个外键的列。然后检查其他两个表是否为外键引用的表。
  • 理想情况下,你知道前两个选定的表应该是引用的表,第三个应该是'十字'或'交叉'或'关联'表,所以你不要必须找出哪个表具有'交叉'角色;您只需检查指定为具有“结点”角色的表确实符合要求。

我认为你可能会更好地向用户展示链接信息,而不是强迫他们选择表格 - 但这取决于你的“用户”本身就是DBA,还是来自HR或财务部门。首先对DBMS和表格一无所知。