“如果不存在则创建表” - 如何检查模式?

时间:2010-03-19 12:15:23

标签: sql database h2 create-table

是否有(或多或少)标准方法不仅检查名为mytable的表是否存在,还检查其模式是否与它应该的类似?我正在试验H2 database

CREATE TABLE IF NOT EXISTS mytable (....)

语句显然只检查表的名称。如果有一个具有给定名称但具有不同模式的表,我希望得到一个例外。

5 个答案:

答案 0 :(得分:4)

CREATE TABLE IF NOT EXISTS ...不是标准的SQL代码。

要做的是检查表是否已经在目录中。 例如,在Java中,您可以执行以下操作: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

有关详细信息,请参阅javadoc java.sql.Connection

答案 1 :(得分:4)

SELECT  *
FROM    INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME      = 'TableName'
    AND TABLE_SCHEMA    = 'public'

答案 2 :(得分:3)

双重答案:

(a)应该通过应用程序的安装过程来确保表的存在,而不是应用程序本身在运行时确保。

(b)如果你真的认为你有合理的理由偏离(a),你可以尝试查询目录,这是一个由表格组成的数据库,其结构或多或少是由INFORMATION_SCHEMA规定的。 SQL标准。存在哪些表,它们具有哪些列,这些列是哪些数据类型,声明了哪些键等等,它们都在那里。

答案 3 :(得分:1)

我不知道任何具有此功能的数据库本身。

没有使用它(使用我自己的代码来执行此操作),但也许Apache DdlUtils可以提供帮助。

这是一件非常棘手的事情,特别是如果你想让它与不同的数据库供应商合作。 此外,对于传递模式需要多么相似,可能存在不同的意见。列名,列顺序,列类型,主键定义:当然。但是约束,约束的名称,表空间定义等等呢?

答案 4 :(得分:0)

简单地说:

IF NOT EXISTS (SELECT 0 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_SCHEMA = 'name_of_schema' 
           AND TABLE_NAME = 'name_of_table')
 BEGIN
     CREATE TABLE [name_of_schema].[name_of_table]
     (
       ...
     )
 END

有关更多示例,请查看 here