是否有一种可移植的方法来确定数据库表是否已经存在?
7 回答
可悲的是,这是可移植的:
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
,但这是最常见的。
便携的?我不这么认为。
也许你能得到的最接近的是:
select * from <table>
如果表不存在,这将返回错误。
我会说
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
这是相当便携的东西:
从表限制 1 中选择 now();
它不依赖于任何特定列的知识。
它不会产生 count(*) 有时具有的开销。
表是否为空并不重要。
如果表不存在,它将失败。
由于每个 DBMS 都有自己的元数据库,我认为最“便携”的方法是使用应用程序调用程序本身。就像是
try
execute("select top 1 * from table")
return (true)
catch
return false
尝试查询表。如果查询失败——你得到一个错误,它不存在。
这可能是您可以获得的便携性。产生结果的负担取决于查询表/数据库的代码。
select top 1 *
from MyTable
使查询尽可能简单,以防止其他可能的错误。