Автор оригинала: Michał Dąbrowski.
1. введение
В этом уроке мы рассмотрим, как мы можем проверить, существует ли таблица в базе данных, используя JDBC и чистый SQL.
2. Использование DatabaseMetaData
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
Если мы хотим проверить, существует ли таблица, нам не нужно перебирать результирующий набор. Нам нужно только проверить, не пуст ли результирующий набор. Давайте сначала создадим таблицу “СОТРУДНИК”:
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 будет работать с именами таблиц в верхнем регистре, поэтому нам нужно использовать “СОТРУДНИК”, а не “сотрудник”.
4. Проверьте, Существует ли Таблица С SQL
Хотя DatabaseMetaData удобен, для достижения той же цели нам может потребоваться использовать чистый SQL. Для этого нам нужно взглянуть на таблицу “ таблицы “, расположенную в схеме “ 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. Заключение
В этом уроке мы узнали, как найти информацию о существовании таблиц в базе данных. Мы использовали как JDBC DatabaseMetaData , так и чистый SQL.
Как обычно, все примеры кода доступны на GitHub .