当前位置: 首页 > 知识库问答 >
问题:

H2数据库添加索引和外键约束时模式语句不成功

轩辕实
2023-03-14

H2似乎不支持使用时Hibernate为MySQL5方言生成的索引/FK语法;MODE=MYSQL和Hibernate方言为org.hibernate.dialect.MySQL5Dialect。

我在这里的目标是拥有一组SQL脚本,并对ORM部分使用hibernate。在MySQL 5.5中一切正常,但当我尝试使用H2进行单元测试和启动应用程序的演示版本时,hibernate生成的alter table语句导致数百次失败,如下所示。不幸的是,我无法找到让hibernate改变语句生成方式的方法,但这也可能是一种选择。我试着使用org。冬眠地方话H2方言,但这会产生更严重的错误,所以我认为这行不通。

alter table SAM_PUBLISHEDSECUREDIP_T
  add index FK1EDEA25B9482C945 (ASSESSMENTID), 
  add constraint FK1EDEA25B9482C945 foreign key (ASSESSMENTID) 
  references SAM_PUBLISHEDASSESSMENT_T (ID)

导致H2中出现如下错误:

组织。h2.jdbc。JdbcSQLException:SQL语句“ALTER TABLE SAM\u PUBLISHEDSECUREDIP\u T ADD INDEX FK1EDA25B9482C945(ASSESSMENTID),[*]ADD CONSTRAINT FK1EDA25B9482C945外键(ASSESSMENTID)引用SAM\u PUBLISHEDASSESSMENT\u T(ID)”中的语法错误;SQL语句:alter table SAM\U PUBLISHEDSECUREDIP\T add index FK1EDA25B9482C945(ASSESSMENTID),add constraint FK1EDA25B9482C945外键(ASSESSMENTID)引用SAM\U PUBLISHEDASSESSMENT\T(ID)[42000-172]

注意:我愿意为H2编写和提供补丁,但我可以使用一些技巧来了解代码库的位置。

共有2个答案

微生毅然
2023-03-14

创建索引不是使用改变表完成的(MySQL真的使用这种奇怪的语法吗?我知道的每个DBMS都使用CREATE INDEX来创建索引)。

您必须将其分为两种陈述:

CREATE INDEX fk_assessment_id_index 
     on SAM_PUBLISHEDSECUREDIP_T (ASSESSMENTID);

alter table SAM_PUBLISHEDSECUREDIP_T
  add constraint FK1EDEA25B9482C945 foreign key (ASSESSMENTID) 
  references SAM_PUBLISHEDASSESSMENT_T (ID);

如果我没弄错的话,这两个语句也应该适用于MySQL。

宗涵蓄
2023-03-14

H2与MySQL不是100%兼容,即使使用MySQL模式也是如此。H2似乎不支持您的一些SQL语句。

 类似资料:
  • 问题内容: 我发现了有关该错误的一些线索。但是所有解决方案都不适合我。 我为用户表创建了2个表,为文章创建了1个表。现在,我要存储创建文章的用户和最后一个修饰符的用户。 我收到以下错误,但我不明白为什么要为此添加索引。 错误代码:1822。无法添加外键约束。引用表“ users”中约束“ fk_articles_users1”的缺少索引 我活跃 但这不会显示任何错误。 问题答案: 不能引用,因为出

  • 下面是一个现有的模型,名为: 下面是我试图创建的新模型: 看起来很简单,对吧?所以我进行迁移: 在网上搜索,我只找到了一个关于Django的问题的例子(在创建表时Django MySQL错误),但这并没有帮助。没有迁移到,我也看不出为什么会有迁移,因为我们最近既没有修改这部分,也没有升级任何包。 对任何帮助深表感谢。

  • 问题内容: 因此,我作为项目需求试图将外键约束添加到数据库中,并且它第一次或在两个不同的表上运行,但是在尝试添加外键约束时,我在两个表上遇到错误。我收到的错误消息是: 错误1215(HY000):无法添加外键约束 这是我用来创建表的SQL,两个有问题的表是和。 问题答案: 要查找特定错误,请运行以下命令: 并查看该部分。 子列的数据类型必须与父列完全匹配。例如,由于是,也需要是,而不是。 另外,您

  • 我试图在两个表之间创建一个外键约束,但在执行alter命令之后,mysql创建了索引而不是外键。 我使用的是hibernate,所以最初我认为这是hibernate的问题,但当我直接在mysql上执行查询时,行为是一样的。 更改表person添加约束FK9ircw28d19mdg5pu8yfg1qs8p外键(Address_Id)引用地址(Address_Id) 运行此命令后,我会在mysql数据

  • 本文向大家介绍在Oracle数据库中添加外键约束的方法详解,包括了在Oracle数据库中添加外键约束的方法详解的使用技巧和注意事项,需要的朋友参考一下 外键指定一个列(或一组列)的值必须符合另一个表的一些行的值。我们说这是维持关联表的参照完整性。 在图形化界面中,在 外键 选项卡,只需简单地点击外键栏位来编辑。使用外键的工具栏,能让你创建新的、编辑或删除选择的外键栏位。 添加外键:添加一个外键到表

  • 我有两张桌子。第一个是人口;第二个是空的。 我希望第二个有一个外键,它引用第一个中的一列。 null 架构: 填充。为空。 不能成为的外键: MySQL没有提供错误的原因;不返回: 我拥有所需的数据库权限。 我已经仔细检查了列(甚至表)是否具有相同的排序规则(字符集不适用于INT列): MySQL无法添加外键约束 MySQL:错误1215(HY000):无法添加外键约束 无法添加外键约束-MySQ