是否有(或多或少)标准方法不仅检查名为mytable
的表是否存在,还检查其模式是否与它应该的类似?我正在试验H2 database和
CREATE TABLE IF NOT EXISTS mytable (....)
语句显然只检查表的名称。如果有一个具有给定名称但具有不同模式的表,我希望得到一个例外。
答案 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。