Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql org.h2.jdbc.JdbcSQLException:未找到列“ID”_Mysql_Database_H2 - Fatal编程技术网

Mysql org.h2.jdbc.JdbcSQLException:未找到列“ID”

Mysql org.h2.jdbc.JdbcSQLException:未找到列“ID”,mysql,database,h2,Mysql,Database,H2,我的代码中有以下DDL: CREATE TABLE IF NOT EXISTS SOMETABLE ( id BIGINT AUTO_INCREMENT NOT NULL, ... FOREIGN KEY (id) REFERENCES OTHERTABLE(id) ... ); 下面是OTHERTABLE的定义: create table "OTHERTABLE" ( "id" BIGINT GENERATED BY DEFAULT AS IDENTITY(START W

我的代码中有以下DDL:

CREATE TABLE IF NOT EXISTS SOMETABLE (
  id BIGINT AUTO_INCREMENT NOT NULL,
  ...
  FOREIGN KEY (id) REFERENCES OTHERTABLE(id)
  ...
);
下面是OTHERTABLE的定义:

create table "OTHERTABLE" (
  "id" BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,
  "code" VARCHAR NOT NULL,
  "name" VARCHAR NOT NULL,
  "enabled" BOOLEAN NOT NULL,
  "app_id" VARCHAR NOT NULL);
请注意,OTHERTABLE是由SLICK Scala ORM堆栈自动生成的

这适用于我们的dev/prod数据库MySQL,但是,我们的单元测试使用H2数据库,执行该数据库将提供以下堆栈跟踪:

org.h2.jdbc.JdbcSQLException: Column "ID" not found
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:169)
at org.h2.message.DbException.get(DbException.java:146)
at org.h2.table.Table.getColumn(Table.java:613)
at org.h2.table.IndexColumn.mapColumns(IndexColumn.java:75)
at org.h2.command.ddl.AlterTableAddConstraint.tryUpdate(AlterTableAddConstraint.java:203)
at org.h2.command.ddl.AlterTableAddConstraint.update(AlterTableAddConstraint.java:70)
at org.h2.command.ddl.CreateTable.update(CreateTable.java:169)
at org.h2.command.CommandContainer.update(CommandContainer.java:79)
at org.h2.command.Command.executeUpdate(Command.java:235)
有一种方法可以解决这个问题,那就是在所有地方都将id更改为id,但这种更改在MySQL中会中断

由于MySQL是我们的prod数据库,我别无选择,只能忽略单元测试

在H2数据库端是否有解决方案

谢谢

如果在使用双引号id创建OTHERTABLE时引用列id,那么在创建引用完整性约束和查询数据时也必须引用它。基本上,你每次都要引用它。我建议在创建表时不要引用它,因为这样以后就不必引用它了。引号表示标识符区分大小写。对于MySQL,它之所以有效,是因为MySQL在内部将unquotes标识符转换为小写,这与其他数据库不同。但对于H2和其他数据库,它不起作用

以下两条语句适用于MySQL和H2:

CREATE TABLE IF NOT EXISTS OTHERTABLE (
  id BIGINT AUTO_INCREMENT NOT NULL
);
CREATE TABLE IF NOT EXISTS SOMETABLE (
  id BIGINT AUTO_INCREMENT NOT NULL,
  FOREIGN KEY (id) REFERENCES OTHERTABLE(id)
);
因此,如果在第二条语句中出现异常,则很可能使用了不同的方法来创建第一个表OTHERTABLE。这就是问题所在

下次,如果您提出问题,请同时包含第一个表的CREATETABLE语句,并发布完整的错误消息。

您看到的查询是错误的 我知道这是在一个公共论坛上愚弄我自己,但我可能不是唯一一个目光短浅的人

在我的例子中,我使用的是H2——也就是说,不是MySQL——所以正确处理小写和大写多少有些可疑。生态系统的其余部分由Java、spring、JPA和Eclipse组成

在整个项目中,相同的长列名称在大写和小写中使用,因此我从那里开始,更改所有出现的Java代码、select查询、create语句…,但这并没有消除异常

然后我追溯到异常,到extractDataResultSet rs方法中提取LONG_COLUMN_NAME值的确切行,到执行查询的DAO方法,到实际使用的查询字符串。。。啊!this.facePalmnew SoundEffectSOUNDS.FOR_ALL__OFFICE__听到表有列,但此测试查询没有:它是从生产查询复制粘贴的,然后表和生产代码演变为使用新版本的查询,包括新列,而测试被抛在后面。因此:事实上,在结果集中找不到任何形式或方式的长列名称


将查询字符串字段更改为指向生产代码中使用的相同字符串属性解决了此问题。

尝试在project中使用数据库的完整路径。排除相对路径后,此问题得到解决。上一个H2数据库版本中使用的~/RELATIVE_路径存在一些错误!坏例子:jdbc:h2:~\com\project\db\h2\h2testdb好例子:jdbc:h2:C:\Users\UserName\IdeaProjects\projectname\com.project\src\main\java\com\test\db\h2\h2testdb

我仍然不清楚这个要求?为什么在对h2数据库执行时找不到这个错误列ID?我如何减轻它?希望这足够清楚?谢谢您能发布完整的错误消息吗?您能发布您用于OTHERTABLE的CREATETABLE语句吗?添加了OTHERTABLE的完整堆栈跟踪和定义谢谢!我已经用OTHERTABLE的定义和更详细的堆栈跟踪更新了这个问题。