我正在尝试编写Java代码来检查H2表是否存在:如果它不存在,它首先执行CREATE TABLE
查询,在进一步继续之前创建该表。
我遵循了this Google Groups question中的建议,但它根本行不通。
如果我运行以下查询:
SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types'
我返回一行COUNT
字段,其值为0;这表示word_types
表不存在。但是当我跑步时:
SELECT * FROM word_types
我得到0个结果集,但我正在使用的SQL前端/ GUI显示了word_types
表中存在的所有字段/列。另外,当我深入查看数据库的可用表列表(使用相同的GUI)时,我看到word_types
存在。
那么在尝试确定H2表是否存在时使用的正确查询是什么? 使用v1.3.173 。提前谢谢!
答案 0 :(得分:51)
首先:检查您输入表格的情况'名。这非常重要。 word_types
和WORD_TYPES
是两个不同的表格
第二:如果您想检查表格是否存在以及是否创建表格,我建议您使用以下示例:
CREATE TABLE IF NOT EXISTS TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));
答案 1 :(得分:14)
还有一个JDBC API可用于查询一个或多个表的存在。
这(理论上)比使用information_schema
的直接查询更具可移植性。
(在实践中,可移植性仍然受到不同DBMS定义和使用概念模式和目录略有不同的事实的限制。
这是它的工作原理:
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_TYPES"
,例如"WORD_%"
。
请注意,H2的配置设置为DATABASE_TO_UPPER
,默认设置为true
。因此,任何表名都将转换为大写,这就是为什么您需要以大写形式查询表(或将DATABASE_TO_UPPER
设置为false
)。
此外,使用其他参数(我在此设置为null
),您可以进一步将搜索范围限制为特定的scema或表类型。
结果集还包含有关表的元信息(如果需要),例如架构或表注释。
有关选项和可用元数据的完整列表,请参阅JavaDoc。
答案 2 :(得分:0)
如果第二个查询没有抛出异常或返回任何行,则只表示该表存在但是为空。
答案 3 :(得分:0)
您的上述查询将返回不存在您的表的记录数,因为您必须触发以下查询。此查询将返回您数据库的所有表,并从那里检查您的“word_types”是否存在。
使用YOURDBNAME 走 选择 * 来自sys.Tables GO
如果有效还是回复我
答案 4 :(得分:0)
path