1

我的数据库有很多父表和子表。这些表包含与父表链接的外键。我想使用java获取子表的父表信息?我该如何实现?

For ex,consider the student and mark table,
The student table contains the information like studentID,name.
studentID-Primary key
The marks table contains the markId,studentId,Sub1,sub2,sub3 etc
markId-Primarykey
studentID-Foreignkey refers Student table

我的表创建查询是,

CREATE TABLE `Student12` (
  `studentId` SMALLINT  NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50)  NOT NULL,
  PRIMARY KEY (`studentId`)
)
ENGINE = InnoDB;


CREATE TABLE `Marks` (
  `markId` SMALLINT  NOT NULL AUTO_INCREMENT,
  `subject1` SMALLINT  NOT NULL,
  `subject2` SMALLINT  NOT NULL,
  `studentId` SMALLINT  NOT NULL,
  PRIMARY KEY (`markId`),
  CONSTRAINT `FK_Marks_Student` FOREIGN KEY `FK_Marks_Student` (`studentId`)
    REFERENCES `Student12` (`studentId`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
)
ENGINE = InnoDB;

如果我将标记表名称作为输入,我怎样才能获得其父表或超级表名称学生以及有关学生表的信息?任何帮助都应该是可观的。

4

3 回答 3

0

JDBC DatasetMetaData 接口提供了一些可能有所帮助的方法。(以下文本复制自 javadoc。

当然,只有在 SQL 表 DDL 中已将相关列声明为外键时,这些才能起作用。

于 2012-04-25T03:08:28.713 回答
0

您可以使用DatabaseMetaData检索有关外键和引用表的信息。我不确定它是否适用于各种 MySql 表。原理是使用以下代码(未测试)来检索有关超级表的信息

ResultSet rs = null;
DatabaseMetaData dm = conn.getMetaData( );

// get super tables of table marks
ResultSet rs = dm.getSuperTables( null , null, "marks" );
while( rs.next( ) ) {

   System.out.println(String.format("Table Catalog %s", rs.getString("TABLE_CAT") );
   System.out.println(String.format("Table Schema %s", rs.getString("TABLE_SCHEM") );
   System.out.println(String.format("Table Name %s", rs.getString("TABLE_NAME") );
   System.out.println(String.format("Table Name %s", rs.getString("SUPERTABLE_NAME") );
}

您可以使用这些信息来获取有关被引用表以及外因和被引用主键的附加信息:

ResultSet rs = dm.getCrossReference( null , null , "student" , null , null , "marks" );
System.out.println(String.format("Exported Keys Info Table %s.", "marks"));
while( rs.next( ) ) {

   String pkey = rs.getString("PKCOLUMN_NAME");
   String ptab = rs.getString("PKTABLE_NAME");
   String fkey = rs.getString("FKCOLUMN_NAME");
   String ftab = rs.getString("FKTABLE_NAME");
   System.out.println("primary key table = " + ptab);
   System.out.println("primary key = " + pkey);
   System.out.println("foreign key table = " + ftab);
   System.out.println("foreign key = " + fkey);
}

最后,您可以通过以下方式检索有关超级表的信息

ResultSet rs = dm.getTables(null,null,"student" ,null);
System.out.println("Table name:");
while (rs.next()){
     String table = rs.getString("TABLE_NAME");
     System.out.println(table);
}
于 2012-04-25T03:20:07.537 回答
0

这完全取决于创建表的方式。外键不是必须创建的,它们可以是一个表中的一个简单列,与另一个表没有明确的关系。如果您非常确定链接是显式创建的(foreign keys已定义),那么您可以使用information_schema. 但是如果没有foreign key定义(在我见过的大多数数据库中都是如此),那么您就无法在数据库中找到链接。您必须查看代码(如果有的话)并尝试找到线索。

于 2012-04-25T02:34:20.237 回答