【问题标题】:Check if a table exists using JDBC使用 JDBC 检查表是否存在
【发布时间】:2014-11-22 03:52:03
【问题描述】:

我的数据库中有一个名为 test2 的表。现在我想检查它是否存在于java代码中。我写了这几行代码来检查表是否存在。

DatabaseMetaData dbm = conn.getMetaData();
             ResultSet rs = dbm.getTables(null, "APP", "test2", null);
             if (!rs.next()) {
                 PreparedStatement create = conn.prepareStatement("create table test2(name2 varchar(33))");
                 create.executeUpdate();
             }else{
                 System.out.println("already exists");
             }

由于 test2 存在于 APP 架构中,我的 else 应该被执行。但在我的情况下,如果被执行。

【问题讨论】:

  • 你为什么要查询一个你一开始就不确定是否存在的表?仅这一点就显得非常非常不寻常。
  • 谁说我不确定它是否存在?它确实存在,我想检查它是否存在的代码。请仔细阅读问题。
  • @Makoto - 这对我来说很有意义。如果我们有一个可能被移动或重命名的关键表,那么您希望您的代码提及这一点。例如。期待 TBL_USERS,但未找到。您可能会发现该表已重命名为 t_customers。
  • @BoratSagdiyev:那时,开发人员没有做好他们的工作;重命名重构必须包括调整/更新表所依赖的任何现有查询。
  • @UsmanRiaz - 请告诉我们您为什么要检查代码中是否存在表。

标签: java sql javadb


【解决方案1】:

Derby 以大写形式存储表名(根据 SQL 标准的要求,许多其他 DBMS 也这样做)

您还需要以大写形式传递表名

ResultSet rs = dbm.getTables(null, "APP", "TEST2", null);

驱动程序(我所知道的所有驱动程序)运行一些类似的东西:

where table_name like 'TEST2'

检索表列表。其中TEST2 是调用getTables() 的未更改值。如果您有一个 DBMS 进行区分大小写的字符串比较(几乎所有 DBMS 都这样做 - 我认为 MySQL 和 SQL 服务器是例外),那么显然表名必须以与存储相同的大小写形式传递。

但是您可以通过引用它们来创建混合大小写的表名称:create table "FooBar" (...) 在这种情况下,您需要将"FooBar" 传递给getTables()

【讨论】:

    猜你喜欢
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多