use*_*644 5 sql reserved-words h2
如何在H2中使用名为GROUP的列创建表?我看到一个例子,前一段时间使用类似[*]的东西,但我似乎无法找到它.
Nes*_*aev 29
我最近也遇到了同样的问题,我的表有“key”和“level”列,这两列都是关键字。因此,解决方案不是重命名实际的表或以任何其他方式破坏数据库/配置,只是为了进行咳嗽测试,而是将以下内容放入驱动程序配置中application.properties
:
jdbc.url=jdbc:h2:mem:db;NON_KEYWORDS=KEY,LEVEL
除此之外,我无需更改 Hibernate/实体设置中的任何内容,JPA 很高兴并且再也没有抱怨过。
请参阅此处的详细信息: https ://www.h2database.com/html/commands.html#set_non_keywords
您必须用引号将保留字列名括起来,就像这样
“团体”
来源(直接链接):h2database.com
关键字/保留字
有一个关键字列表不能用作标识符(表名、列名等),除非它们被引用(用双引号括起来)。目前名单如下:
CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, DISTINCT, EXCEPT, EXISTS, FALSE, FOR, FROM, FULL, GROUP , HAVING, INNER, INTERSECT, IS, JOIN, LIKE, LIMIT, MINUS, NATURAL, NOT, ORDER, ON PRIMARY、ROWNUM、SELECT、SYSDATE、SYSTIME、SYSTIMESTAMP、TODAY、TRUE、UNION、UNIQUE、WHERE
此列表中的某些词是关键字,因为它们是为了兼容性可以在没有“()”的情况下使用的函数,例如 CURRENT_TIMESTAMP。
我一直在使用 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:
Run Code Online (Sandbox Code Playgroud)
我的模型类有一个名为 limit 的字段。
修复方法是将列名称指定为
@Column(name = "`limit`")
Run Code Online (Sandbox Code Playgroud)
添加尾随下划线:GROUP_
SQL规范明确承诺†没有关键字将具有尾随下划线.因此,您可以保证使用前导或尾随下划线创建的任何命名都不会与关键字或保留字冲突.
我使用尾随下划线在数据库中命名我的所有列,约束等.起初看起来有点奇怪,但你已经习惯了看到它.事实证明有一个很好的副作用:在所有编程以及笔记和电子邮件中,当我看到尾随下划线时,我知道上下文是数据库而不是编程变量或业务术语.
另一个好处是安心.这样的解脱可以消除由于关键字冲突导致的整类可能的错误和奇怪的问题.如果你在想,"没什么大不了的 - 有几个SQL关键词需要记住和避免",请再想一想.有无数个关键字和保留字,一个数不胜数是过千.
Shiva的答案也是正确的:在名称周围添加引号"GROUP"
确实解决了问题.缺点是记住添加这些引用将是令人厌烦和麻烦的.
进一步提示:为了在各种SQL数据库之间实现最大兼容性,请以全小写的方式命名.SQL规范说所有名称都应该以大写形式存储,同时容忍小写.但不幸的是,有些(大多数?)数据库在这方面没有遵循规范.经过数小时的各种数据库研究,我得出结论,全小写为您提供了最大的可移植性.
所以我实际上建议你为你的专栏命名: group_
多个单词名称如下所示:given_name_
和date_of_first_contact_
†我不能引用SQL规范,因为它受版权保护,不幸的是.在SQL:2011规范中,请阅读标题语法规则项目3,注释111 下的标题和标识符部分.在SQL-92中,请参见第5.2节,第11项.只搜索单词将起作用.underscore