5

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

4

7 回答 7

4

可悲的是,这是可移植的:

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

这绝对适用于 SQL Server、MySQL 和 Postgres。不过,在甲骨文上并没有那么多。为此,您必须访问 Oracle 数据字典。但是,有一个开源项目可以在 Oracle 中从数据字典中创建。information_schema如果您需要绝对的便携性,您可以尝试一下。

PS-Schema 不一定是dbo,但这是最常见的。

于 2009-08-04T14:45:20.233 回答
4

便携的?我不这么认为。

也许你能得到的最接近的是:

select * from <table>

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

于 2009-08-04T14:48:07.700 回答
2

我会说

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

缺点是,如果您遇到错误,您无法确定真正的原因是什么。它可能缺少表或例如连接错误。您可以解析错误消息,但绝对不能移植。

于 2012-07-12T13:01:16.170 回答
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
于 2009-08-04T14:51:51.920 回答
1

这是相当便携的东西:

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

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

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

表是否为空并不重要。

如果表不存在,它将失败。

于 2012-02-04T09:49:36.757 回答
0

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

try
    execute("select top 1 * from table")
    return (true)
catch
    return false
于 2009-08-04T14:48:19.913 回答
0

尝试查询表。如果查询失败——你得到一个错误,它不存在。

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

select top 1 *
from MyTable

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

于 2009-08-04T14:48:41.863 回答