2012-01-10 68 views
0

我一直在研究不间断,只能设法找出 - 如何检查SQL中的一对多关系。我想知道是否有人可以帮助我找出如何检查SQL代码中的多对多关系。数据库中的表格使用正常的格式。用于检查多对多关系的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 + "') 
+2

你能解释一下你有什么吗?你有没有一张桌子,你正试图分析它,看它是否处于正确的正常形式?或者你有多个表,你试图看看是否有一个关联表(或联结表)与主键包含两个引用其他表?试图找到多对多关系的目的是什么? – 2012-01-10 05:40:39

+0

这个答案应该是有帮助的:http://stackoverflow.com/questions/786918/many-to-many-relationship-use-associative-table-or-delimited-values-in-a-column – 2012-01-10 05:48:50

+0

数据库处于正常的正常形式。我的情况是:用户将从数据库中选择三个表,一旦选择了三个表,我需要检查这些表是否具有多对多关系。所以我需要检查用户选择的这三个表是否与主键关联,并且交叉表具有指向另外两个表的两个引用键。我希望我已经解释得够多了。 – SpaceApple 2012-01-10 05:58:23

回答

0

我不知道这使用户选择三个表一样,是个不错的UI设计,但我们会把这个放在一边暂且。

您尚未指定您正在使用哪种语言编写,或者您正在使用的DBMS。因此,具体细节将会丢失。然而:

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

我认为您可能会更好地向用户展示链接信息,而不是强迫他们选择表 - 但这取决于您的“用户”本身是DBA还是来自HR或者财务,并且对于DBMS和表格毫无头绪。

+0

用户是开发人员将使用此应用程序,使表维护更容易。基本上它是一个SQL关系数据库:这是我在同一时间的代码,但我知道这不是正确的解决方案,因为它只能一次检查两个表,而不是三个。 – SpaceApple 2012-01-10 07:53:05