【问题标题】:check table existence in RDBMS databases检查 RDBMS 数据库中的表是否存在
【发布时间】:2016-06-13 22:31:18
【问题描述】:

如何以通用的方式检查表是否存在于 Oracle、Teradata、SQL Server、DB2 等数据库中。

选项 1:

Select 1 from Table;

选项2:

Describe Table;

哪个更好,或者还有其他更好的方法吗?

编辑:不是所有这些数据库都支持select 1 from Table 以及检查存在的通用方法吗?

【问题讨论】:

  • 您听说过术语系统目录或数据字典吗?即使您在查询可能存在的表时遇到错误,但您无法访问。
  • Describe 当然不是 SQL Server 的有效选项 ....
  • Describe 是 Oracle 中的一个客户端命令,因此它可以在 SQL*Plus 或 SQL Developer 以及其他人中工作,但不能通过 JDBC;即使在这些客户端中,您也需要解析客户端输出以查看它是否存在。
  • 鉴于您命名的数据库,据我所知,没有通用方法可以使用 SQL 查询来完成您尝试执行的操作。所有这些数据库都没有实现 ANSI 标准INFORMATION_SCHEMA(Oracle 是一个值得注意的非实现者;可能还有其他数据库)。各种与供应商无关的数据库访问方法,例如 ODBC(和 JDBC?)实现了查询元数据的方法,但并非所有驱动程序都实现了这些方法。
  • 如果您使用 Java/JDBC,您可以使用 DatabaseMetaData.getTables() - 然后驱动程序将负责生成正确的查询

标签: sql-server oracle db2 teradata rdbms


【解决方案1】:

这应该适用于 SQL Server 和 MySQL

select *
from    INFORMATION_SCHEMA.TABLES
where   TABLE_NAME =  'Table'

不支持:甲骨文

【讨论】:

  • Oracle 中没有 INFORMATION_SCHEMA,至少到 11.1 为止,除非您自己构建了类似的东西。在 Oracle 中,最好的办法是查询 USER_TABLES、ALL_TABLES 或 DBA_TABLES。
  • 真的吗?很久没有接触Oracle了。我一定是弄错了。但可以发誓我以前在甲骨文上使用过。 .
  • 也许他们已经取消了它(我对此表示怀疑),但我已经检查了从 9 到 11.1 的 Oracle 数据库 - 它们都没有实现 INFORMATION_SCHEMA。所有提及 INFORMATION_SCHEMA 的 Oracle 文档参考都是针对 MySQL 的。
  • 我猜,那一定是内部视图。
【解决方案2】:

简单的答案:没有方法可以完成您的要求。不同的 RDBMS 以不同的方式表示模式、表、权限和数据字典。

更大的答案:提出问题的实体需要知道它正在查询什么 RDBMS。然后就可以为所讨论的数据库系统形成表存在问题。即使有了这些信息,@data_hinrik 也是正确的,但权限可能会阻止您查看现有表。

【讨论】:

    【解决方案3】:

    在 Oracle 中有 user_tables 视图来检查用户模式中存在的所有表。 all_tables 视图,用于查看用户模式中存在的表以及当前用户对其他模式的表具有选择权限的表。 dba_tables 包含数据库中的所有表。

    select * from user_tables where table_name='YOURTABLENAME';
    

    【讨论】:

      【解决方案4】:

      使用 JDBC 的通用方式:

      Connection conn;
      <...connect here...>
      
      try {
        conn.createStatement().executeQuery("select * from " + table_name + " where 1=0");
      } catch (Exeception e) {
          System.out.println("ERROR: " + e.toString());
      } 
      

      【讨论】:

      • 至少在查询中添加where 1 = 0,否则 JDBC 驱动程序实际上可能会检索该表中的 1000 万行。
      • 如果您开始获取 ResultSet 则不会;但是,是的,安全总比后悔好 - 我更新了它。
      • 某些 JDBC 驱动程序在您运行 executeQuery() 时已经获取数据
      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2017-03-31
      • 2013-05-11
      • 1970-01-01
      相关资源
      最近更新 更多