Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java H2:如何判断表是否存在?_Java_Sql_Jdbc_H2 - Fatal编程技术网

Java H2:如何判断表是否存在?

Java H2:如何判断表是否存在?,java,sql,jdbc,h2,Java,Sql,Jdbc,H2,我试图编写Java代码来检查H2表是否存在:如果H2表不存在,它首先执行CREATE table查询,在继续之前创建该表 我听从了这个建议,但它根本不起作用 如果我运行以下查询: SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types' 我得到了一个带有COUNT字段的单行,该字段的值为0;这表明单词类型表不存在。但当我跑步时: SELECT * FROM word_types

我试图编写Java代码来检查H2表是否存在:如果H2表不存在,它首先执行
CREATE table
查询,在继续之前创建该表

我听从了这个建议,但它根本不起作用

如果我运行以下查询:

SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types'
我得到了一个带有
COUNT
字段的单行,该字段的值为0;这表明
单词类型
表不存在。但当我跑步时:

SELECT * FROM word_types
我返回了0个结果集,但是我正在使用的SQL前端/GUI显示了
word\u types
表中存在的所有字段/列。此外,当我深入到数据库的可用表列表(使用相同的GUI)时,我看到
word\u类型存在


那么,当试图确定H2表是否存在时,正确的查询是什么使用v1.3.173。提前谢谢

如果第二个查询没有抛出异常或返回任何行,则表示该表存在,但为空。

上述查询将返回记录计数而不是表的存在,因此必须触发以下查询。此查询将返回数据库的所有表,从中可以检查“word\u类型”是否存在

使用你的名字 去 挑选* 从系统表 去


如果有效或无效,请回复我首先:检查键入表格名称的大小写。这很重要<代码>单词类型和
单词类型是两个不同的表。
第二步:如果要检查表是否存在,如果不存在,则创建一个表,我建议您使用以下示例:

CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));

还有一个JDBCAPI,您可以使用它来查询一个或多个表的存在。 这(理论上)比使用
信息\u模式的直接查询更具可移植性

(在实践中,由于不同的DBM对概念模式和目录的定义和使用略有不同,移植性仍然受到一定的限制)

这就是它的工作原理:

boolean tableExists = false;

Connection conn = getConnection(); // get a DB connection from somewhere
ResultSet rset = conn.getMetaData().getTables(null, null, "WORD_TYPES", null);
if (rset.next())
{
  tableExists = true;
}
您也可以使用SQL样式的通配符,例如
“WORD%”而不是
“WORD类型”

请注意,H2有一个配置设置
DATABASE_TO_UPPER
,默认设置为
true
。因此,任何表名都转换为大写,这就是为什么您需要以大写形式查询表(或将
数据库\u设置为\u upper
设置为
false

另外,使用其他参数(我在这里设置为
null
),可以进一步将搜索范围限制为特定的scema或表类型

如果需要,resultset还包含有关表的元信息,例如模式或表注释


有关选项和可用元数据的完整列表,请参阅。

在查询系统表时,可能存在大小写问题。用下面的函数再试一次。若myTable不存在,为什么不使用
创建表呢?您的逻辑是什么,您每次在执行查询之前或应用程序启动时检查一次?您的方法对我来说运行良好-如果第一个查询返回0,则第二个查询给出错误代码
表不存在
谢谢@DanBracuk(+1)-我应该在哪里应用较低的函数?你能提供一个代码示例吗?再次感谢!谢谢@Admit(+1)-这是个不错的建议,如果其他建议都失败了,我可能会同意。我的逻辑是在应用程序启动时检查一次。请使用编辑器上的“代码示例”按钮标记sql语句、代码示例等。您可以编辑您的答案以使用该按钮,这有助于编写更可读的答案。感谢@Rohit Goyla(+1)-但我在尝试sql时遇到以下错误:
错误:sql语句中的语法错误“使用[*]MYAPP_DB GO从SYS.TABLES GO中选择*;应为“更新,{”;SQL语句:使用myapp_db GO SELECT*FROM sys.Tables GO[42001-173]SQLState:42001 ErrorCode:42001
据我所知,该语句
USE YOURDBNAME
适用于Microsoft SQL Server。但问题在于用户。您在@Qigar(+1)上锁定了它-这是一个大小写问题。当我创建表时,我将表名指定为
word\u types
。当我运行
SELECT*FROM word\u types
时,我看到表存在,但没有返回行(这是正确的,我还没有在其中插入任何内容)但是我必须在检查
信息模式的查询中将表名指定为
WORD\u TYPES
。表
table是否存在我的
WORD\u类型
table。奇怪。这是因为表名在
信息模式中以大写形式存储。表
和命令区分大小写。但是我不能告诉您hy名称是这样存储的。不带引号的表名通常不区分大小写,但在大多数数据库中,它们总是以相同的大小写存储(通常是大写,有时是小写)。请参阅我的答案。有一个配置设置
DATABASE_TO_UPPER
负责此行为,因为它根据默认值设置为
TRUE
。ResultSet rset=conn.getMetaData()。getTables(null,null,“WORD_类型”,null))总是为我返回null。。。。
    Connection con = getConnection();
    Boolean tableExist = false;
    PreparedStatement preparedStatement = con.prepareStatement("SHOW TABLES FROM INFORMATION_SCHEMA");
        Boolean rq = preparedStatement.execute();
        if(rq) {
                ResultSet rs = preparedStatement.getResultSet();
                while (rs.next()) {
                    if(rs.getString(rs.getRow()).equals("WORD_TYPES")) {
                        isExist = true;
                        break;
                }
            }
        }