【发布时间】:2013-11-14 12:36:30
【问题描述】:
如何在 H2 中创建一个包含名为 GROUP 的列的表?不久前我看到一个使用类似 [*] 的示例,但我似乎找不到它。
【问题讨论】:
-
我尝试了一些数据库(PostgreSQL、MySQL、SQLite、Apache Derby、HSQLDB)。 所有都拒绝名为
group的列。
标签: sql h2 reserved-words
如何在 H2 中创建一个包含名为 GROUP 的列的表?不久前我看到一个使用类似 [*] 的示例,但我似乎找不到它。
【问题讨论】:
group的列。
标签: sql h2 reserved-words
添加尾随下划线: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 就可以了。
【讨论】:
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。
我在使用 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`")
【讨论】:
您必须将保留字列名括在引号中,就像这样
“组”
来源(直接链接):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。
【讨论】: