是否有(相对而言)标准的方式来检查不仅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'
INFORMATION_SCHEMA
是(有点)标准化的,因此该语句在大多数数据库中都可以使用。 - Thomas MuellerINFORMATION_SCHEMA.COLUMNS
的查询来检查现有列是否与预期的匹配,并对此做出反应。然而,我认为使用类似于命名/编号迁移和迁移表的东西,就像EntityFramework支持的那样,会更容易且更少出错 - 特别是当您需要保留现有数据但由于模式更改而更改其存储方式时。 - binkiCREATE TABLE IF NOT EXISTS ...
不是标准的 SQL 代码。
需要做的事情是检查目录中是否已经存在该表。例如,在 Java 中,您可以执行以下操作:
connection.getMetaData().getTables(connection.getCatalog(), null, null, null)
更多信息请参见javadoc java.sql.Connection。
双重答案:
(a) 数据表的存在应该由应用程序的安装过程来确保,而不是在运行时由应用程序本身来确保。
(b) 如果您真的认为有一个合理的理由偏离(a),您可以尝试查询目录。目录是一个数据库,由SQL标准的INFORMATION_SCHEMA规定表结构。其中包含哪些表存在、它们具有哪些列、这些列的数据类型、声明了哪些键等等,所有这些信息都在目录中。
我不知道有哪个数据库本身具备这个功能。
虽然我没有使用过它(我自己编写了代码来实现此功能),但也许Apache DdlUtils可以帮助你。
这是一件棘手的事情,特别是如果你想让它与不同的数据库供应商一起工作。此外,关于模式需要多么相似才能通过,可能会有不同的意见。列名、列顺序、列类型、主键定义:当然需要相似。但是约束条件、约束名称、表空间定义等呢?
简单来说:
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
mytable
的表,则它的模式必须等于我在查询中提供的内容;否则,我希望得到某种错误提示。这是一个非常明确的查询,所以我想知道是否有一种方法可以表示它(如果没有,为什么没有)。事实上,我很惊讶“IF NOT EXISTS”似乎只检查名称。 - Joonas Pulakka