我的数据库有很多父表和子表。这些表包含与父表有链接的外键。我想用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;
如果我将标记表名称作为输入,如何获取其父表或超级表名学生以及有关学生表的信息?任何帮助都应该是值得注意的。
答案 0 :(得分:0)
这完全取决于表的创建方式。外键不是必须创建的,它们可以是一个表中的简单列,与另一个表没有明确的关系。如果您非常确定明确创建了链接(foreign keys
已定义),那么您可以使用information_schema
。但是如果没有定义foreign key
(在我见过的大多数数据库中都是如此),那么你就无法找到数据库中的链接。您必须查看代码(如果有可用的话)并尝试找到线索。
答案 1 :(得分:0)
JDBC DatasetMetaData接口提供了一些可能有用的方法。 (以下文本是从javadoc中复制的。
ResultSet getExportedKeys(String catalog, String schema, String table)
检索引用给定表的主键列(由表导出的外键)的外键列的描述。
ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable)
检索给定外键表中引用主键的外键列的描述或表示父表的唯一约束的列(可以是相同或不同的表)。
当然,只有在SQL表DDL中将相关列声明为外键时,这些才有效。
答案 2 :(得分: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") );
}
您可以使用这些信息来获取有关引用表的其他信息 和foreigen和引用的主键:
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);
}