我有一个java程序,通过任何类型的数据库查询任何数量的表 . 用户可以放入一个字符串,它将返回包含该字符串的表和行 . 问题是这些表中的一些有外键 . 在递交数据库之前,我怎么能递归地遍历查找外键和行而没有任何知识的所有表?
平台:Windows 7(64)数据库类型:Postgres
码:
public static void connectPostGres(String type, String server, String database, String port, String username, String password) {
System.out.println("-------- PostgreSQL JDBC Connection Testing ------------");
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
System.out.println("Where is your PostgreSQL JDBC Driver? Include in your library path!");
e.printStackTrace();
return;
}
System.out.println("PostgreSQL JDBC Driver Registered!");
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:postgresql://" + server + ":" + port + "/" + database, username, password);
//connection = DriverManager.getConnection("*********);
} catch (SQLException e) {
System.out.println("doh!");
e.printStackTrace();
return;
}
if (connection != null) {
System.out.println("Searching...");
LinkedList allTables = new LinkedList();
try {
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("select * from pg_tables");//get all the tables
while (rs.next()) {
String myString = rs.getString("tablename");
if (myString.trim().charAt(0) == 'p' && myString.trim().charAt(1) == 'g') {
//this is just some crappy tables we dont want to query through
} else if (myString.trim().charAt(0) == 's' && myString.trim().charAt(1) == 'q' && myString.trim().charAt(2) == 'l') {
//this is just some crappy tables we dont want to query through
} else {
allTables.add(myString);//add all tables to a linkedlist
}
}
rs.close();
String masterQuery = "";
for (int i = 0; i columnList = new LinkedList();
for (int j = 1; j 0) {
for (int j = 0; j
2 回答
您可以在DatabaseMetaData中查询此类信息:
见DatabaseMetaData
您可以阅读有关检索postgres元数据的信息article .
通常,您必须深入了解INFORMATION SCHEMA或使用系统目录 .
EDIT
此外,将尽可能多的逻辑放入SQL中,以避免检索和处理根本不需要的数据 .
这是来自上述文章的复制/粘贴,其中列出了所有约束(您可以在这里找到这两种方法)