H2: как определить, существует ли таблица?
Я пытаюсь написать Java-код, который проверяет, существует ли таблица H2: если она не существует, она сначала выполняет запрос CREATE TABLE
, который создает таблицу, прежде чем продолжить.
Я пошел за советом в этот вопрос в Google Groups, но он просто не работает.
Если я запустил следующий запрос:
SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types'
Я возвращаю одну строку с полем COUNT
, которое имеет значение 0; это означает, что таблицы word_types
не существуют. Но когда я запускаю:
SELECT * FROM word_types
Я возвращаю 0 наборов результатов, но интерфейс/графический интерфейс SQL, который я использую, показывает мне все поля/столбцы, которые существуют в таблице word_types
. Кроме того, когда я перехожу в список доступных в базе данных таблиц (используя тот же графический интерфейс), я вижу word_types
.
Итак, какой правильный запрос использовать при попытке определить, существует ли таблица H2 или нет? Использование v1.3.173. Спасибо заранее!
Ответы
Ответ 1
Сначала: проверьте случай, в котором вы вводите имена таблиц. Это очень важно. word_types
и word_types
- это две разные таблицы.
Вторые: Если вы хотите проверить, существует ли таблица, а если нет, то создайте ее, я рекомендую использовать следующий пример:
CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));
Ответ 2
Существует также JDBC API, который вы можете использовать для запроса существования одной или нескольких таблиц.
Это (теоретически) более портативный, чем прямой запрос, который использует information_schema
.
(На практике переносимость по-прежнему несколько ограничена тем фактом, что разные СУБД определяют и используют схему понятий и каталог несколько иначе).
Вот как это работает:
boolean tableExists = false;
Connection conn = getConnection(); // get a DB connection from somewhere
ResultSet rset = conn.getMetaData().getTables(null, null, "WORD_TYPES", null);
if (rset.next())
{
tableExists = true;
}
Вместо "WORD_TYPES"
вы также можете использовать подстановочные знаки SQL-Style, например. "WORD_%"
.
Обратите внимание, что H2 имеет настройку конфигурации DATABASE_TO_UPPER
, для которой установлено значение true
по умолчанию. Поэтому любое имя таблицы преобразуется в верхний регистр, поэтому вам нужно запросить таблицу в верхнем регистре (или установить DATABASE_TO_UPPER
в false
).
Кроме того, используя другие параметры (которые я установил здесь null
здесь), вы можете дополнительно ограничить область поиска конкретным типом scema или таблицы.
В набор результатов также входит метаинформация о таблице, если вам это нужно, например, комментарий схемы или таблицы.
Смотрите JavaDoc для получения полного списка опций и доступных метаданных.
Ответ 3
Если второй запрос не генерирует исключение или не возвращает какие-либо строки, это означает, что таблица существует, но пуста.
Ответ 4
В приведенном выше запросе будет возвращен счетчик записей, не содержащийся в вашей таблице, для этого вам нужно запустить запрос follwing. Этот запрос вернет вам всю таблицу вашей базы данных и оттуда вы сможете проверить, существует ли ваш "word_types".
ИСПОЛЬЗУЙТЕ YOURDBNAME
ИДТИ
ВЫБРАТЬ *
FROM sys.Tables
GO
ответьте мне, если он работает или не работает.
Ответ 5
Connection con = getConnection();
Boolean tableExist = false;
PreparedStatement preparedStatement = con.prepareStatement("SHOW TABLES FROM INFORMATION_SCHEMA");
Boolean rq = preparedStatement.execute();
if(rq) {
ResultSet rs = preparedStatement.getResultSet();
while (rs.next()) {
if(rs.getString(rs.getRow()).equals("WORD_TYPES")) {
isExist = true;
}
}
}