【发布时间】:2020-02-28 00:03:01
【问题描述】:
我正在创建一个备份系统,用于记录使用 Java 创建预先存在的数据库所需的 SQL 查询。我知道它有查询但是我不能在我的生命中得到它在一开始就列出所有表创建查询并且我有一个想法来获取数据库中的表数,然后放置在循环中创建表部分,该循环运行数据库中有表的次数,但是我遇到了障碍。使用 JDBC 实现这一目标的最佳方法是什么?下面是我要循环的部分。
while (/*loop contents here */)
{
ResultSet columns = databaseMetaData.getColumns(null, null, currentTable, null);
System.out.print("CREATE TABLE " + currentTable + " (");
while(columns.next())
{
String columnName = columns.getString("COLUMN_NAME");
String columnType = columns.getString("TYPE_NAME");
/*String selectCol = "SELECT * FROM " + currentTable;
ResultSet allColumns = statement.executeQuery(selectCol);*/
System.out.print(columnName + " " + columnType + ", ");
}
ResultSet PrimKey = databaseMetaData.getPrimaryKeys(null, null, currentTable);
System.out.print("PRIMARY KEY (");
while(PrimKey.next())
{
if(!PrimKey.isFirst())
{
System.out.print(", ");
}
System.out.print(PrimKey.getString("COLUMN_NAME"));
}
System.out.print(")");
ResultSet ForKey = databaseMetaData.getImportedKeys(null, null, currentTable);
while(ForKey.next())
{
if(!ForKey.isFirst())
{
System.out.print("FOREIGN KEY (" + ForKey.getString("PKCOLUMN_NAME") + ")");
System.out.print(" REFERENCES " + ForKey.getString("FKTABLE_NAME") + "(" + ForKey.getString("FKCOLUMN_NAME") + ")");
}
}
System.out.print("); \n");//Ends the sql query.
}
【问题讨论】:
-
顺便说一句,如果我没记错的话,如果您使用“.dump tablename”命令,sqlite 将返回您手动编写的所有创建命令。
-
@vefthym 不特别,因为我想要表的数量而不是名称?除非你在暗示什么,而我太愚蠢/太累了,没注意到?
-
如果我理解你的问题是正确的,你正在寻找表的数量,这样你就可以遍历它们中的每一个,获取它们的名称并在 create 语句中使用它。我建议的链接提供的是一种遍历每个表名的方法,而无需知道有多少表。我没有看到您的代码的任何部分本身使用了表数。
-
@vefthym 我的代码当前输出一个 CREATE TABLE,然后输出该相关表的所有 INSERT INTO,然后移动到下一个 CREATE TABLE 等。我希望它先创建每个表,然后输入所有内容在它们全部创建之后。