我的代码中有以下 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 Stack)自动生成的!
这适用于 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 是我们的产品数据库,我别无选择,只能忽略单元测试!
H2数据库方面有解决方案吗?
Thanks
如果您引用该专栏id
创建时OTHERTABLE
使用双引号 ("id"
),那么在创建引用完整性约束和查询数据时也必须引用它。基本上,你每次都必须引用它。我建议not创建表时引用它,因为这样您以后就不必引用它。引用意味着标识符区分大小写。对于 MySQL,它之所以有效,是因为 MySQL 在内部将不带引号的标识符转换为小写,这与其他数据库不同。但对于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
)。这就是问题所在。
下次如果您提出问题,请同时包括create table
第一个表的声明,并发布complete错误信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)