コードからこれを行う方法があると思いますが、少なくともいくつかの良い回避策があります。
すべてのテーブルを削除したくない(このコマンドを見た)ことを考慮してください。テーブルから行を削除するだけで、既存のスキーマとすべての制約を保持します。
メタデータからすべてのテーブルのリストを取得し、それぞれに個別にTRUNCATEコマンドを適用できるのではないでしょうか。しかし、それらの関係と外部キーはどうですか?
何か案が?
あなたはこのようにそれをするかもしれません:
SET REFERENTIAL_INTEGRITY FALSE
を使用して参照整合性を無効にする
SHOW TABLES
を使用してすべてのテーブルのリストを取得します
TRUNCATE TABLE tableName
を使用して各テーブルからデータを削除します
SET REFERENTIAL_INTEGRITY TRUE
を使用して参照整合性を有効にする
今のところ、私はこの解決策を思いつきました...しかし、それでももっと徹底的にテストする必要があります。
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'");
}
次に、 ストアドプロシージャ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を使用した春のテストですべてのテーブルを切り捨てる を参照してください。