使用 JDBC 创建表查询不适用于不同的数据库引擎



我编写了一个与某些数据库引擎(例如MySQL,PostgreSQL)互操作的scala程序。

我使用 JDBC API 来处理 SQL 查询。我使用查询来创建表,并且我想使用用户给出的字段创建一个表,然后这些字段是可以包含空格或带重音的单词的名称。

例如,创建一个包含 2 个字段的表虚拟人,">列 1"和"列 2">作为 varchar 字段。

为 MySQL 数据库编写此查询,同时保留字段中包含的空格,我们需要在查询中使用反引号,例如:

CREATE TABLE dummy (`column 1` varchar(20), `column 2` varchar(20));

同样,在保留空格的同时为 PostgreSQL 编写此查询的正确方法是:

CREATE TABLE dummy ("column 1" varchar(20), "column 2" varchar(20));

也许对于另一个数据库引擎,有一种不同的方法来编写此查询。

是否有任何标准方法可以使用上述约束并使用JDBC编写此查询,以便它与任何数据库引擎一起使用?

提前感谢您的回答。

这并没有直接解决您的问题,但我认为您最好不要以这种方式命名您的列。我会"规范化"列名(例如,用下划线替换空格)。

无论如何,列名可能不应该直接向用户公开。 如果您需要列的"人类可读"名称,我会将它们存储在另一个表中。或者,如果它像保留空格一样简单,只需反转该过程,将下划线替换为空格。

如前所述,您不应使用空格、特殊字符或保留字作为列名或表名。为了安全起见,您通常可以在表名和列名周围加上引号,以避免跨数据库出现区分大小写的问题。

CREATE TABLE "foo" ("id" VARCHAR(32), "bar" VARCHAR(64))

根据 SQL-99 标准,双引号 (") 用于分隔标识符。大小写敏感性实际上与使用的数据库类型及其设置有关。有些数据库将大写或小写您的表和列名称,如果它们没有引号,但有时仅在CREATE TABLEALTER TABLE命令中。这可能会导致运行时错误。

例如,CREATE TABLE foo实际上可能会创建一个名为FOO的表。执行SELECT * FROM foo时,您可能会收到错误,因为表foo不存在,但表FOO确实存在。在处理过许多DBMS之后,我倾向于使用引号作为表和列名。

重要的部分是,在使用引号时,您必须坚持写小写或大写,因为"foo"不等于"FOO",但根据使用的DBMSfoo可能等于FOO。要么做小写要么大写,但如果你使用引号,请坚持下去。

您还应该避免特定于数据库的列类型(尽可能坚持使用 ANSI SQL)。

但是手动进行数据库迁移非常繁琐且容易出错。我建议使用迁移工具(flyway db)或让像slick这样的库创建迁移。

正如你提到的scala,请看一下Slick(http://slick.lightbend.com/),这是一个很棒的scala功能数据库层。还有其他的,但我大量使用,可以推荐它。

最新更新