1. 序章

このチュートリアルでは、JDBCと純粋なSQLを使用してデータベースにテーブルが存在するかどうかを確認する方法を見ていきます。

2. DatabaseMetaDataを使用する

JDBC は、データベースに対してデータを読み書きするためのツールを提供します。 テーブルに格納されている実際のデータに加えて、データベースを説明するメタデータを読み取ることができます。 これを行うには、JDBC接続から取得できるDatabaseMetaDataオブジェクトを使用します。

DatabaseMetaData databaseMetaData = connection.getMetaData();

DatabaseMetaData は多くの有益なメソッドを提供しますが、必要なのはgetTablesの1つだけです。 使用可能なすべてのテーブルを印刷するために使用しましょう:

ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] {"TABLE"});

while (resultSet.next()) {
    String name = resultSet.getString("TABLE_NAME");
    String schema = resultSet.getString("TABLE_SCHEM");
    System.out.println(name + " on schema " + schema);
}

最初の3つのパラメーターを指定しなかったため、すべてのカタログとスキーマのすべてのテーブルを取得しました。 たとえば、クエリを1つのスキーマのみに絞り込むこともできます。

ResultSet resultSet = databaseMetaData.getTables(null, "PUBLIC", null, new String[] {"TABLE"});

3. テーブルがDatabaseMetaDataで存在するかどうかの確認

テーブルが存在するかどうかを確認する場合は、結果セットを反復処理する必要はありません。 結果セットが空でないかどうかを確認するだけで済みます。最初に「EMPLOYEE」テーブルを作成しましょう。

connection.createStatement().executeUpdate("create table EMPLOYEE (id int primary key auto_increment, name VARCHAR(255))");

これで、メタデータオブジェクトを使用して、作成したばかりのテーブルが実際に存在することを表明できます。

boolean tableExists(Connection connection, String tableName) throws SQLException {
    DatabaseMetaData meta = connection.getMetaData();
    ResultSet resultSet = meta.getTables(null, null, tableName, new String[] {"TABLE"});

    return resultSet.next();
}

SQLでは大文字と小文字は区別されませんが、getTablesメソッドの実装では大文字と小文字が区別されることに注意してください。 小文字でテーブルを定義しても、大文字で格納されます。 そのため、 getTables メソッドは大文字のテーブル名を操作するため、「employee」ではなく「EMPLOYEE」を使用する必要があります。

4. テーブルがSQLで存在するかどうかを確認します

DatabaseMetaData は便利ですが、同じ目標を達成するには純粋なSQLを使用する必要がある場合があります。 これを行うには、スキーマ「information_schema」にある「tables」テーブルを確認する必要があります。これは SQL-92 標準の一部であり、ほとんどの場合に実装されています。主要なデータベースエンジン(Oracleを除く)。

tables」テーブルにクエリを実行して、フェッチされた結果の数を数えましょう。 テーブルが存在する場合は1、存在しない場合は0を期待します。

SELECT count(*) FROM information_schema.tables
WHERE table_name = 'EMPLOYEE' 
LIMIT 1;

JDBCで使用するには、単純なプリペアドステートメントを作成し、結果のカウントがゼロに等しくないかどうかを確認します。

static boolean tableExistsSQL(Connection connection, String tableName) throws SQLException {
    PreparedStatement preparedStatement = connection.prepareStatement("SELECT count(*) "
      + "FROM information_schema.tables "
      + "WHERE table_name = ?"
      + "LIMIT 1;");
    preparedStatement.setString(1, tableName);

    ResultSet resultSet = preparedStatement.executeQuery();
    resultSet.next();
    return resultSet.getInt(1) != 0;
}

5. 結論

このチュートリアルでは、データベース内のテーブルの存在に関する情報を見つける方法を学びました。 JDBCのDatabaseMetaDataと純粋なSQLの両方を使用しました。

いつものように、すべてのコード例はGitHubから入手できます。