1. Введение
В этом руководстве мы рассмотрим, как мы можем проверить, существует ли таблица в базе данных, используя JDBC и чистый SQL.
2. Использование метаданных базы данных
JDBC предоставляет нам инструменты для чтения и записи данных в базу данных. Помимо фактических данных, хранящихся в таблицах, мы можем читать метаданные, описывающие базу данных. Для этого мы будем использовать объект DatabaseMetaData
, который мы можем получить из соединения JDBC:
DatabaseMetaData databaseMetaData = connection.getMetaData();
DatabaseMetaData
предоставляет множество информативных методов, но нам понадобится только один: getTables
. Давайте используем его для печати всех доступных таблиц:
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);
}
Поскольку мы не указали первые три параметра, мы получили все таблицы во всех каталогах и схемах. Мы также можем сузить наш запрос, например, до одной схемы:
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 для достижения той же цели. Для этого нам нужно взглянуть на таблицу « tables
», расположенную в схеме « information_schema
». Это часть стандарта SQL-92 , и он реализован в большинстве основных механизмов баз данных (за заметным исключением Oracle).
Давайте запросим таблицу « tables
» и подсчитаем, сколько результатов было получено. Мы ожидаем единицу, если таблица существует, и ноль, если ее нет:
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. Вывод
В этом уроке мы узнали, как найти информацию о существовании таблицы в базе данных. Мы использовали как DatabaseMetaData
JDBC, так и чистый SQL.
Как обычно, все примеры кода доступны на GitHub .