用于确定表是否存在的可移植SQL?

时间:2009-08-04 14:43:30

标签: sql portability

是否有一种可移植的方法来确定数据库表是否已经存在?

7 个答案:

答案 0 :(得分:4)

这很可携带,遗憾的是:

select
    count(*)
from
    information_schema.tables
where
    table_name = 'tablename'
    and table_schema = 'dbo'

这绝对适用于SQL Server,MySQL和Postgres。尽管如此,与Oracle无关。您必须为此访问Oracle数据字典。但是,有一个来自数据字典的creates information_schema in Oracle开源项目。如果您需要绝对的便携性,可以试试。

P.S.-Schema不一定是dbo,但这是最常见的。

答案 1 :(得分:4)

便携式?我不这么认为。

也许最接近的是:

select * from <table>

如果表不存在,这将返回错误。

答案 2 :(得分:2)

我会说

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

缺点是如果你收到错误,你不确定究竟是什么原因。它可能缺少表格,例如连接错误。您可以解析错误消息,但绝对不会是可移植的。

答案 3 :(得分: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

答案 4 :(得分:1)

这是一个相当便携的东西:

  

从TABLE限制1中选择now();

它不依赖于任何特定列的知识。

它不会产生count(*)有时会产生的开销。

表格是否为空无关紧要。

如果表不存在则失败。

答案 5 :(得分:0)

由于每个DBMS都有自己的元数据库,我认为最“可移植”的方法是使用应用程序调用者本身。像

这样的东西
try
    execute("select top 1 * from table")
    return (true)
catch
    return false

答案 6 :(得分:0)

尝试查询表格。如果查询失败 - 您收到错误,它就不存在。

这可能是你可以获得的便携性。产生结果的负担取决于查询表/数据库的代码。

select top 1 *
from MyTable

使查询尽可能简单,以防止出现其他可能的错误。