Переносимый SQL для определения того, существует таблица или нет?

StackOverflow https://stackoverflow.com/questions/1227921

  •  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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top