Я использую соединение Odbc с mysql сервером и задавался вопросом, как я пойду о проверке, если таблица будет существовать в моей базе данных, и в противном случае создайте его.
Используйте CREATE TABLE IF NOT EXISTS
.
К сведению, не все РСУБД поддерживают CREATE ... IF NOT EXISTS
. MySQL поддерживает, но для тех, кто ищет более портативное решение, знайте, что у вас есть несколько (менее эффективных, но в остальном функциональных) способов добиться того же самого:
CREATE TABLE
; если таблица уже существует, в этом случае просто пропустите ошибку и продолжите SELECT
из объекта tables
в ANSI information_schema
чтобы узнать, существует ли уже данная таблица (как изначально предложил @Derek
-- см. ответ @lexu
для фактического запроса); в зависимости от результата, либо выдать CREATE TABLE
-- либо не выдавать (при обращении к information_schema. tables
остерегайтесь таких вопросов, как чувствительность имен таблиц к регистру, возможность появления вашей таблицы в нескольких схемах и т.д.)Я не знаю синтаксис mysql, но все базы данных, которые я когда-либо использовал, предоставляют набор таблиц, содержащих метаданные о данных. Т.е. системные таблицы. Вы можете просто выполнить select count для нужной системной таблицы, используя имя таблицы в предложении where, чтобы узнать, существует ли она. Могут быть и другие способы.
Я бы посоветовал заглянуть в doco по mysql для получения информации о системных таблицах и о том, как к ним обращаться. Поскольку это mysql, все, вероятно, довольно просто.
Помимо подхода Влада Романскану к создать таблицу, если не существует NEW_TABLE_NAME
в одном приятном прямом операторе, всегда есть возможность запросить ИНФОРМАЦИЯ_СХЕМА. (Я думаю, это то, что предлагает Дерек Кларксон).
Этот подход требует большего количества кодирования на стороне клиента ...
вы можете использовать этот запрос:
select count(TABLE_NAME)
from INFORMATION_SCHEMA
where TABLE_SCHEMA = 'your schema'
and TABLE_NAME = 'your table'
group by TABLE_NAME
ПРИМЕЧАНИЕ в Mysql у вас может возникнуть соблазн пропустить последнюю 'group by', я склонен быть немного озабоченным этим и оставить это в покое, чтобы у меня не было неприятных встреч при работе с другой СУБД.
Этот случай, который полностью специфичен для MySQL, является пограничным!