是否有一种可移植的方法来确定数据库表是否已经存在?
答案 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
使查询尽可能简单,以防止出现其他可能的错误。