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

Ska*_*rab 6 derby hsqldb

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

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

 SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = <DATABASE NAME>
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ler 8

检查数据库是否存在

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

您可以检查数据库文件是否存在.缺点是这取决于数据库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>'
Run Code Online (Sandbox Code Playgroud)

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