Java H2:如何判断表是否存在?
我试图编写Java代码来检查H2表是否存在:如果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
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;
}
}
}