«Создать таблицу, если она не существует» - как проверить схему? - PullRequest
11 голосов
/ 19 марта 2010

Существует (более или менее) стандартный способ проверки не только того, существует ли таблица с именем mytable, но также и то, похожа ли ее схема на то, какой она должна быть? Я экспериментирую с базой данных H2 и

CREATE TABLE IF NOT EXISTS mytable (....)

операторы, очевидно, проверяют только имя таблицы . Я ожидаю получить исключение, если есть таблица с заданным именем, но другой схемой.

Ответы [ 4 ]

4 голосов
/ 04 сентября 2012
SELECT  *
FROM    INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME      = 'TableName'
    AND TABLE_SCHEMA    = 'public'
4 голосов
/ 19 марта 2010

CREATE TABLE IF NOT EXISTS ... не является стандартным кодом SQL.

Нужно проверить, есть ли таблица уже в каталоге. Например, в Java вы можете сделать что-то вроде: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

Для получения дополнительной информации см. javadoc java.sql.Connection .

3 голосов
/ 19 марта 2010

Двойной ответ:

(a) Наличие таблицы - это то, что должно быть обеспечено процедурой установки приложения, а не самим приложением во время выполнения.

(b) Если вы действительно считаете, что у вас есть веская причина для отклонения от (a), вы можете попробовать запросить каталог, который представляет собой базу данных, состоящую из таблиц, структура которых более или менее предписана INFORMATION_SCHEMA стандарт SQL. Какие таблицы существуют, какие столбцы у них есть, какие типы данных эти столбцы, какие ключи объявлены и т. Д. И т. Д., Все это есть.

1 голос
/ 19 марта 2010

Я не знаю ни одной базы данных, которая имеет эту функцию изначально.

Не использовал его (свернул мой собственный код для этого), но, возможно, Apache DdlUtils может помочь.

Это сложная вещь, особенно если вы хотите, чтобы она работала с различными поставщиками баз данных. Также, возможно, существуют разные мнения о том, насколько сходной должна быть схема для прохождения. Имена столбцов, порядок столбцов, типы столбцов, определение первичного ключа: конечно. Но как насчет ограничений, имен ограничений, определений табличного пространства и т. Д.?

...