是否有(或多或少)标准方法来检查是否有一个名为的表 mytable
存在,但它的架构是否类似于它应该是什么?我正在试验 H2数据库,和
CREATE TABLE IF NOT EXISTS mytable (....)
声明显然只检查表格 名称。如果有一个具有给定名称但具有不同模式的表,我希望得到一个例外。
是否有(或多或少)标准方法来检查是否有一个名为的表 mytable
存在,但它的架构是否类似于它应该是什么?我正在试验 H2数据库,和
CREATE TABLE IF NOT EXISTS mytable (....)
声明显然只检查表格 名称。如果有一个具有给定名称但具有不同模式的表,我希望得到一个例外。
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TableName'
AND TABLE_SCHEMA = 'public'
CREATE TABLE IF NOT EXISTS ...
不是标准的SQL代码。
要做的是检查表是否已经在目录中。
例如,在Java中,您可以执行以下操作:
connection.getMetaData().getTables(connection.getCatalog(), null, null, null)
有关详情,请参阅 javadoc java.sql.Connection。
我不知道任何具有此功能的数据库本地。
没有使用它(滚动我自己的代码来做到这一点)但也许 Apache DdlUtils 可以帮助。
这是一件棘手的事情,特别是如果你想让它与不同的数据库供应商合作。 此外,对于传递模式需要多么相似,可能存在不同的意见。列名,列顺序,列类型,主键定义:当然。但是约束,约束的名称,表空间定义等等呢?
双重回答:
(a)应该通过应用程序的安装过程来确保表的存在,而不是应用程序本身在运行时。
(b)如果你真的认为你有正当理由偏离(a),你可以尝试查询目录,这是一个由表格组成的数据库,其结构或多或少是由SQL标准的INFORMATION_SCHEMA规定的。 。存在哪些表,它们具有哪些列,这些列是哪些数据类型,声明了哪些键等等,它们都在那里。