如何检查Hsqldb / Derby中是否存在数据库?

时间:2010-09-27 07:17:10

标签: derby hsqldb

我正在寻找有关如何检查数据库是否存在的信息 - 来自Java代码 - 在hsqldb和Apache derby中。在Mysql中它非常简单,因为我可以查询系统表 - INFORMATION_SCHEMA.SCHEMATA - 但这两个数据库似乎没有这样的表。

什么是mysql查询的替代方法:

 SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = <DATABASE NAME>

查找hsqldb和apache derby中是否存在数据库?

2 个答案:

答案 0 :(得分:7)

检查数据库是否存在

一种解决方案是将“; ifexists = true”附加到数据库URL并尝试以这种方式打开数据库。如果数据库不存在,您将收到异常。这适用于HSQLDB和H2数据库。对于Apache Derby,追加“; create = false”(实际上,只需确保没有“; create = true”)。 “; create = false”也适用于H2数据库,但不适用于HSQLDB(在那里它只是被忽略)。这种“; ifexists = true”/“; create = false”技巧的缺点是:您将使用异常处理进行应用程序流控制,这应该避免(不仅因为抛出异常很慢)。此外,您将打开一个您可能不想要的连接。更新:HSQLDB 2.x似乎将堆栈跟踪打印到System.err(!)如果数据库不存在并使用“; ifexists = true”,除了抛出异常。

您可以检查数据库文件是否存在。缺点是这取决于数据库URL如何映射到文件名,这取决于数据库内部,例如数据库类型和数据库版本(!),也可能取决于系统属性。对于Derby,您需要检查目录是否存在,还需要检查某些文件,例如“service.properties”(似乎)。对于HSQLDB,您可以检查文件databaseName.properties是否存在。对于H2,检查文件databaseName.h2.db。这与当前版本的Derby / HSQLDB / H2有关,并且可能在将来发生变化。

问题是,当然:为什么你需要知道数据库是否已经存在?

检查架构是否存在

也许您实际上并不想检查数据库是否存在。相反,您只想检查数据库中是否存在给定的架构。为此,您可以使用

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '<SCHEMA NAME>'

这适用于HSQLDB(自版本2.x)和H2。它也适用于其他数据库。一个例外是Derby,它不支持标准化的INFORMATION_SCHEMA模式。

答案 1 :(得分:1)

对于HSQLDB 2.0(使用最新的快照以更好地与MySQL兼容),只要数据库/模式未被称为“PUBLIC”,就不必进行太多更改

连接到测试数据库(可以是全内存数据库)将默认创建一个空数据库(包含PUBLIC模式)。这是你使用

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME ='DATABASE NAME'

请注意,名称应使用单引号。我不知道MySQL是否接受单引号中的名称。

如果架构不存在,那么就像运行MySQL一样运行架构创建代码。

相关问题