"Создать таблицу, если она не существует" - как проверить схему тоже?

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

CREATE TABLE IF NOT EXISTS mytable (....)
Операторы

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

Ответ 1

SELECT  *
FROM    INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME      = 'TableName'
    AND TABLE_SCHEMA    = 'public'

Ответ 2

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

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

Подробнее см. javadoc java.sql.Connection.

Ответ 3

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

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

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

Ответ 4

Дважды ответ:

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

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