【问题标题】:H2 database column name "GROUP" is a reserved wordH2数据库列名“GROUP”是保留字
【发布时间】:2013-11-14 12:36:30
【问题描述】:

如何在 H2 中创建一个包含名为 GROUP 的列的表?不久前我看到一个使用类似 [*] 的示例,但我似乎找不到它。

【问题讨论】:

  • 我尝试了一些数据库(PostgreSQL、MySQL、SQLite、Apache Derby、HSQLDB)。 所有都拒绝名为group的列。

标签: sql h2 reserved-words


【解决方案1】:

尾随下划线

添加尾随下划线GROUP_

SQL 规范明确承诺任何关键字都不会有尾随下划线。因此,您可以保证使用尾随下划线创建的任何命名都不会与关键字或保留字冲突。

我用下划线结尾命名数据库中的所有列、约束等。乍一看有点奇怪,但习惯了。原来有一个很好的副作用:在所有的编程以及笔记和电子邮件中,当我看到结尾的下划线时,我知道上下文是数据库,而不是编程变量或业务术语。

另一个好处是安心。由于关键字冲突,消除了一整类可能的错误和奇怪的问题,这是一种解脱。如果你在想,“没什么大不了的——有几个 SQL 关键字需要记住和避免”,再想一想。有a zillion keywords and reserved words无数超过一千。


Shiva 的回答也是正确的:在名称"GROUP" 周围添加引号确实可以解决问题。不利的一面是,记住添加这些引号会让人厌烦和麻烦。


进一步提示:为了在各种 SQL 数据库之间实现最大兼容性,请将您的命名全部小写。 SQL 规范说所有名称都应该以大写形式存储,同时允许小写。但不幸的是,一些(大多数?)数据库在这方面未能遵循规范。经过对各种数据库的数小时研究,我得出结论,全小写可以为您提供最大的可移植性。

所以我实际上建议你为你的专栏命名:group_

多个单词名称如下所示:given_name_date_of_first_contact_


不幸的是,我不能引用 SQL 规范,因为它受版权保护。在 SQL:2011 规范中,阅读第 5.4 节 名称和标识符 标题下的标题 语法规则 第 3 项,注意 111。在 SQL-92 中,请参阅第 5.2 节,第 11 项。只需搜索单词underscore 就可以了。

【讨论】:

  • 可以引用受版权保护的作品;合理使用允许您引用不重要的部分,只要您注明作品的来源并且不复制“大量”金额...
  • @Ben 我没有聘请律师。 ANSI 和 ISO 大概可以。
  • The SQL spec explicitly promises† that no keyword will ever have a trailing underscore. leading underscore?我的意思是that any naming you create with a leading or trailing underscore
  • @Pavel_K 我不知道为什么我在那里写“前导或尾随”。我已更正它,删除了“前导或”。我所见过的公开可用的 SQL 规范草案只承诺避免标识符/名称中的 trailing 下划线。感谢您指出这一点。
【解决方案2】:

我在使用 JPA 生成的 SQL 时遇到了这个问题……原来我使用了一个名为 limit 的变量名。

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "CREATE TABLE EXPENSE_LIMIT (ID BIGINT NOT NULL, LIMIT[*] DECIMAL(19,2), ACCOUNT_ID BIGINT, EXPENSE_CATEGORY_ID BIGINT, PERIOD_ID BIGINT, PRIMARY KEY (ID)) "; expected "identifier"; SQL statement:

我的模型类有一个名为 limit 的字段。

解决方法是将列名指定为

@Column(name = "`limit`")

【讨论】:

    【解决方案3】:

    您必须将保留字列名括在引号中,就像这样

    “组”

    来源(直接链接):h2database.com

    关键字/保留字

    有一个不能用作标识符的关键字列表(表 名称,列名等),除非它们被引用(包围 带双引号)。该列表目前是:

    CROSS、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、DISTINCT、 EXISTS、EXISTS、FALSE、FOR、FROM、FULL、GROUP、HAVING、INNER、 相交、是、加入、喜欢、限制、减号、自然、非、空、开、 ORDER、PRIMARY、ROWNUM、SELECT、SYSDATE、SYSTIME、SYSTIMESTAMP、TODAY、 TRUE、UNION、UNIQUE、WHERE

    此列表中的某些单词是关键字,因为它们是函数 例如,为了兼容性,可以不使用 '()' 使用 CURRENT_TIMESTAMP。

    【讨论】:

    • 不要这样做...拜托。你最终会伤害自己;只需将其称为不是保留字的名称即可。
    • 正如@Ben 所建议的,使用保留字不是一个好主意。您始终可以为列名添加前缀或后缀以使其不保留。有时,如果我不能在逻辑上为列名添加前缀或后缀,我只使用“the”。比如“集团”。但通常情况下,您可以想出一个逻辑前缀或后缀,例如“ProductGroup”或“AuthorGroup”(使用代表组的名词作为前缀。)。
    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多