【问题标题】:Counting the number of tables in a SQLite DB计算 SQLite DB 中的表数
【发布时间】: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 等。我希望它先创建每个表,然后输入所有内容在它们全部创建之后。

标签: java sql jdbc


【解决方案1】:

我认为link I provided in comments 可以解决问题,但让我详细说明如何使用它,以防我错了,或者我没有正确回答您的问题:

ResultSet rs = databaseMetaData.getTables(null, null, "%", null);
while (rs.next()) {
    String currentTable = rs.getString(3));
    ResultSet columns = ...// the rest of your code goes here as is
}

如果,引用你的问题,你的问题是:

我一辈子都无法在开始时列出所有的表创建查询

建议:您可能需要考虑更简单且不易出错的方法来备份 sqlite 数据库,例如使用 sqlite3 命令行工具的.backup.dump 命令优惠。有关详细信息,请参阅this post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多