14

Is there a (more or less) standard way to check not only whether a table named mytable exists, but also whether its schema is similar to what it should be? I'm experimenting with H2 database, and

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

statements apparently only check for the table´s name. I would expect to get an exception if there's a table with the given name, but different schema.

4

5 回答 5

5
SELECT  *
FROM    INFORMATION_SCHEMA.TABLES
WHERE   TABLE_NAME      = 'TableName'
    AND TABLE_SCHEMA    = 'public'
于 2012-09-03T23:42:38.620 回答
4

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

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

有关更多信息,请参阅javadoc java.sql.Connection

于 2010-03-19T12:47:13.207 回答
3

双重答案:

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

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

于 2010-03-19T19:32:44.973 回答
1

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

没有使用它(滚动我自己的代码来做到这一点)但也许Apache DdlUtils可以提供帮助。

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

于 2010-03-19T12:44:42.177 回答
1

简单地:

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

有关更多示例,请查看此处

于 2021-03-03T15:52:38.120 回答