如何在H2中创建一个名为GROUP的列?我刚才看到一个使用类似[*]之类的例子,但我似乎无法找到它。
答案 0 :(得分:6)
添加尾随下划线:GROUP_
SQL规范明确承诺†没有关键字会有一个尾随下划线。因此,您可以保证使用前导或尾随下划线创建的任何命名都不会与关键字或保留字冲突。
我使用尾随下划线在数据库中命名我的所有列,约束等。起初看起来有点奇怪,但你已经习惯了看到它。事实证明有一个很好的副作用:在所有编程以及笔记和电子邮件中,当我看到尾随下划线时,我知道上下文是数据库而不是编程变量或业务术语。
另一个好处是安心。这样的解脱可以消除由于关键字冲突导致的整类可能的错误和奇怪的问题。如果你在想,“没什么大不了的 - 有几个SQL关键词需要记住和避免”,请再想一想。有a zillion keywords and reserved words, zillion 超过一千。
Shiva的答案也是正确的:在名称"GROUP"
周围添加引号确实解决了问题。缺点是记住添加这些引用将是令人厌烦和麻烦。
进一步提示:为了在各种SQL数据库中实现最大兼容性,请以全小写的方式命名。 SQL规范说所有名称都应该以大写形式存储,同时容忍小写。但不幸的是,有些(大多数?)数据库在这方面没有遵循规范。经过数小时的各种数据库研究,我得出结论,全小写为您提供了最大的可移植性。
因此,我实际上建议您为列命名:group_
多个单词名称如下所示:given_name_
和date_of_first_contact_
†我不能引用SQL规范,因为它受版权保护,不幸的是。在SQL:2011规范中,请阅读标题语法规则第3项注释111下的名称和标识符部分。在SQL-92中参见第5.2节,项目11.只需搜索单词underscore
即可。
答案 1 :(得分:3)
您必须用引号括起保留字列名称,如此
“GROUP”
来源(直接链接):h2database.com
关键字/保留字
有一个不能用作标识符的关键字列表(表格 名称,列名等),除非它们被引用(包围 用双引号)。目前的清单是:
CROSS,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,DISTINCT, 除了,EXISTS,FALSE,FOR,FROM,FULL, GROUP ,HAVING,INNER, INTERSECT,IS,JOIN,LIKE,LIMIT,MINUS,NATURAL,NOT,NULL,ON, ORDER,PRIMARY,ROWNUM,SELECT,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY, TRUE,UNION,UNIQUE,WHERE
此列表中的某些单词是关键字,因为它们是函数 例如,可以在没有'()'的情况下使用它来实现兼容性 CURRENT_TIMESTAMP。
答案 2 :(得分:0)
我在使用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的字段。那只是一个愚蠢的错误