Переносимый SQL для определения того, существует таблица или нет?
-
22-07-2019 - |
Вопрос
Существует ли переносимый способ определения того, существует ли таблица базы данных уже или нет?
Решение
Портативный?Я так не думаю.
Может быть, самое близкое, что вы можете найти, это:
select * from <table>
И это вернет ошибку, если таблица не существует.
Другие советы
К сожалению, это настолько переносимо, насколько это возможно:
select
count(*)
from
information_schema.tables
where
table_name = 'tablename'
and table_schema = 'dbo'
Это определенно работает на SQL Server, MySQL и Postgres. Не так много на Oracle, хотя. Для этого вам нужно получить доступ к словарю данных Oracle. Однако существует проект с открытым исходным кодом, который создает information_schema
в Oracle из словарь данных. Вы можете попробовать это, если вам нужна абсолютная мобильность.
P.S.-Schema не обязательно должна быть dbo
, но это наиболее распространенная форма.
Я бы сказал
select 'x' from <table_name> where 0=1;
Недостатком является то, что если вы получаете сообщение об ошибке, вы не знаете наверняка, что было реальной причиной.Это может быть отсутствующая таблица или, например,ошибка подключения.Вы можете проанализировать сообщение об ошибке, но оно определенно не будет переносимым.
Представления INFORMATION_SCHEMA соответствуют стандарту ANSI, поэтому они должны быть наиболее переносимым вариантом. Не забудьте добавить схему и тип таблицы в предложение where ...
if exists(select *
from information_schema.tables
where table_schema = 'dbo'
and table_name = 'MyTable'
and table_type = 'basetable')
begin
-- your code here
end
Вот что-то, что является достаточно переносимым:
выберите now () из TABLE limit 1;
Это не зависит от знания какого-либо конкретного столбца.
Это не приводит к накладным расходам, которые иногда имеет счет (*).
Неважно, пустая таблица или нет.
Сбой, если таблица не существует.
Поскольку каждая СУБД имеет свою собственную метабазу, я думаю, что самый & переносимый " способ сделать это с помощью самого приложения вызывающего. Что-то вроде
try
execute("select top 1 * from table")
return (true)
catch
return false
Попытка запросить таблицу. Если запрос не выполняется - вы получаете сообщение об ошибке, его не существует.
Это, вероятно, настолько портативно, насколько вы можете получить. Бремя получения результата зависит от кода, запрашивающего таблицу / базу данных.
select top 1 *
from MyTable
Сделайте запрос как можно более простым, чтобы избежать других возможных ошибок.