web-dev-qa-db-ja.com

H2-すべてのテーブルを切り捨てる方法は?

コードからこれを行う方法があると思いますが、少なくともいくつかの良い回避策があります。

すべてのテーブルを削除したくない(このコマンドを見た)ことを考慮してください。テーブルから行を削除するだけで、既存のスキーマとすべての制約を保持します。

メタデータからすべてのテーブルのリストを取得し、それぞれに個別にTRUNCATEコマンドを適用できるのではないでしょうか。しかし、それらの関係と外部キーはどうですか?

何か案が?

18
Filip

あなたはこのようにそれをするかもしれません:

23
Julian Ladisch

今のところ、私はこの解決策を思いつきました...しかし、それでももっと徹底的にテストする必要があります。

private void truncateDatabase () throws SQLException {
    String tempDir = System.getProperty("Java.io.tmpdir");
    File tempRestoreFile = new File(tempDir + File.separator + "tempRestore");
    Connection connection = dataSource.getConnection(); 
    Statement statement = connection.createStatement();
    statement.execute("SCRIPT SIMPLE NODATA DROP TO '" + tempRestoreFile + "' CHARSET 'UTF-8'");
    statement.execute("RUNSCRIPT FROM '" + tempRestoreFile.getAbsolutePath() + "' CHARSET 'UTF-8'");
}
2
Filip

次に、 ストアドプロシージャtruncate_all_tablesの例を示します。これは、外部キーを無効にし、現在のスキーマのすべてのテーブルを切り捨ててから、外部キーを有効にします。

DROP ALIAS IF EXISTS truncate_all_tables;
CREATE ALIAS truncate_all_tables AS $$
    void truncateAllTables(Connection conn) throws SQLException {
        conn.createStatement().executeUpdate("SET FOREIGN_KEY_CHECKS=0");
        ResultSet rs = conn.createStatement().
            executeQuery("SELECT table_name FROM information_schema.tables WHERE table_schema = SCHEMA()");
        while (rs.next()) {
            String tableName = rs.getString(1);
            conn.createStatement().executeUpdate("TRUNCATE TABLE \"" + tableName + "\" RESTART IDENTITY");
        }
        conn.createStatement().executeUpdate("SET FOREIGN_KEY_CHECKS=1");
    }
$$;

CALL truncate_all_tables();

または、コードで関数を定義できます。

public class H2Functions {
  public static void truncateAllTables(Connection conn) throws SQLException {
    conn.createStatement().executeUpdate("SET FOREIGN_KEY_CHECKS=0");
    ResultSet rs = conn.createStatement().
      executeQuery("SELECT table_name FROM information_schema.tables WHERE table_schema = SCHEMA()");
    while (rs.next()) {
      String tableName = rs.getString(1);
      conn.createStatement().executeUpdate("TRUNCATE TABLE \"" + tableName + "\" RESTART IDENTITY");
    }
    conn.createStatement().executeUpdate("SET FOREIGN_KEY_CHECKS=1");
  }
}

次に、エイリアスとして使用します。

SET MODE REGULAR;
CREATE ALIAS IF NOT EXISTS truncate_all_tables FOR "com.yourcompany.H2Functions.truncateAllTables";
CALL truncate_all_tables();
SET MODE MySQL;

ここでは、例としてSET MODEステートメントを追加しました。MySQLモードでH2を使用している場合は、H2モードに切り替えてから、関数を宣言してから、MySQLモードに戻す必要があります。

残念ながら、truncate_all_tablesはauto_inc列をリセットしません。詳細については、 メモリデータベース内のH2を使用した春のテストですべてのテーブルを切り捨てる を参照してください。

0