如何在 H2 中创建一个包含名为 GROUP 的列的表?不久前我看到一个使用类似 [*] 的示例,但我似乎找不到它。
4 回答
尾随下划线
添加尾随下划线:GROUP_
SQL 规范明确承诺†</sup> 任何关键字都不会有尾随下划线。因此,您可以保证使用尾随下划线创建的任何命名都不会与关键字或保留字冲突。
我用尾随下划线命名数据库中的所有列、约束等。乍一看有点奇怪,但习惯了。事实证明有一个很好的副作用:在所有编程以及注释和电子邮件中,当我看到结尾的下划线时,我知道上下文是数据库,而不是编程变量或业务术语。
另一个好处是安心。由于关键字冲突,消除了一整类可能的错误和奇怪的问题,这是一种解脱。如果你在想,“没什么大不了的——有几个 SQL 关键字需要记住和避免”,再想一想。关键字和保留字数不胜数,一千多个。
Shiva 的回答也是正确的:在名称周围添加引号"GROUP"
,确实可以解决问题。缺点是记住添加这些引号会很烦人和麻烦。
进一步提示:为了在各种 SQL 数据库之间实现最大兼容性,请使用全部小写字母进行命名。SQL 规范说所有名称都应该以大写形式存储,同时允许小写。但不幸的是,一些(大多数?)数据库在这方面未能遵循规范。经过对各种数据库的数小时研究,我得出结论,全小写可以为您提供最大的可移植性。
所以我实际上建议你命名你的专栏:group_
多个单词名称如下所示:given_name_
和date_of_first_contact_
†</sup> 不幸的是,我不能引用 SQL 规范,因为它受版权保护。在SQL:2011规范中,请阅读标题语法规则第3 项注 111下的第 5.4 节名称和标识符。在SQL-92中,请参阅第 5.2 节第 11 项。只需搜索该单词即可。underscore
您必须将保留字列名括在引号中,就像这样
“团体”
来源(直接链接):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, NULL, ON, ORDER, 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:
我的模型类有一个名为limit的字段。
修复方法是将列名指定为
@Column(name = "`limit`")
我最近也遇到了同样的问题,我的表有列“key”和“level”,它们都是关键字。因此,与其重命名实际表或以任何其他方式混淆数据库/配置,只是为了咳嗽测试,修复方法是将以下内容放入驱动程序配置中application.properties
:
jdbc.url=jdbc:h2:mem:db;NON_KEYWORDS=KEY,LEVEL
除此之外,我不必更改休眠/实体设置中的任何内容,JPA 很高兴,再也没有抱怨过。
在此处查看详细信息: https ://www.h2database.com/html/commands.html#set_non_keywords