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

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 に答える
0

JDBC DatasetMetaData インターフェースには、役立つメソッドがいくつか用意されています。(次のテキストは javadoc からコピーされます。

もちろん、これらは、関連する列が SQL テーブル DDL で外部キーとして宣言されている場合にのみ機能します。

于 2012-04-25T03:08:28.713 に答える