Подтвердить что ты не робот

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. Спасибо заранее!

4b9b3361

Ответ 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;
                }
            }
        }