Есть ли переносимый способ определить, существует ли уже таблица базы данных или нет?

5
jkp 4 Авг 2009 в 18:43

7 ответов

Лучший ответ

Портативный? Я так не думаю.

Возможно, самое близкое, что вы можете найти, это:

select * from <table>

И это вернет ошибку, если таблица не существует.

4
Alan 4 Авг 2009 в 14:48

К сожалению, это настолько портативно, насколько это возможно:

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.-Схема не обязательно должна быть dbo, но это наиболее распространенный вариант.

4
Eric 4 Авг 2009 в 14:50

Я бы сказал

select 'x' from <table_name> where 0=1;

Недостатком является то, что если вы получаете сообщение об ошибке, вы точно не знаете, в чем была настоящая причина. Возможно, отсутствует таблица или, например, ошибка подключения. Вы можете проанализировать сообщение об ошибке, но оно определенно не будет переносимым.

2
pkalinow 8 Май 2017 в 14:43

Представления 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
1
Scott Ivey 4 Авг 2009 в 14:51

Вот что-то достаточно портативное:

выберите now () из ТАБЛИЦЫ предел 1;

Он не полагается на знание какой-либо конкретной колонки.

Это не влечет за собой накладных расходов, которые иногда возникают у count (*).

Неважно, пуста таблица или нет.

Ошибка, если таблица не существует.

1
Jay 4 Фев 2012 в 09:49

Поскольку каждая СУБД имеет свою собственную метабазу, я думаю, что наиболее «переносимый» способ сделать это - использовать саму вызывающую программу. Что-то типа

try
    execute("select top 1 * from table")
    return (true)
catch
    return false
0
Rodrigo 4 Авг 2009 в 14:48

Попытка запросить таблицу. Если запрос не удался - вы получите ошибку, его не существует.

Это, вероятно, настолько портативно, насколько это возможно. Бремя получения результата зависит от кода, запрашивающего таблицу / базу данных.

select top 1 *
from MyTable

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

0
Frank V 4 Авг 2009 в 14:48