Ответ 1
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TableName'
AND TABLE_SCHEMA = 'public'
Существует ли (более или менее) стандартный способ проверки не только того, существует ли таблица с именем mytable
, но также и ее схема похожа на то, что она должна быть? Я экспериментирую с базой данных H2 и
CREATE TABLE IF NOT EXISTS mytable (....)
Операторы по-видимому, проверяют только имя таблицы. Я ожидал бы получить исключение, если есть таблица с заданным именем, но другая схема.
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TableName'
AND TABLE_SCHEMA = 'public'
CREATE TABLE IF NOT EXISTS ...
не является стандартным кодом SQL.
Дело в том, чтобы проверить, находится ли таблица в каталоге.
Например, в Java вы можете сделать что-то вроде:
connection.getMetaData().getTables(connection.getCatalog(), null, null, null)
Подробнее см. javadoc java.sql.Connection.
Я не знаю ни одной базы данных, которая имеет эту функцию изначально.
Не использовал его (перевернул мой собственный код, чтобы сделать это), но может Apache DdlUtils может помочь.
Это сложная задача, особенно если вы хотите, чтобы она работала с разными поставщиками баз данных. Кроме того, есть, вероятно, разные мнения о том, как должна выглядеть схема, чтобы пройти. Имена столбцов, порядок столбцов, типы столбцов, определение первичного ключа: конечно. Но как насчет ограничений, имен ограничений, определения табличного пространства и т.д.?
Дважды ответ:
(a) Существование таблицы - это то, что должно обеспечиваться процедурой установки приложения, а не самим приложением во время выполнения.
(b) Если вы действительно считаете, что у вас есть веская причина отклонения от (a), вы можете попробовать и запросить каталог, который представляет собой базу данных, состоящую из таблиц, структура которых более или менее предписана в INFORMATION_SCHEMA стандарт SQL. Какие таблицы существуют, какие столбцы у них есть, какие данные представляют эти столбцы, какие ключи объявлены и т.д. И т.д., Все это там.