5

コードに次の 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データベース側でこれに対する解決策はありますか?

ありがとう

4

3 に答える 3

9

二重引用符 ( ) を使用してid作成するときに列を引用する場合は、参照整合性制約を作成するとき、およびデータをクエリするときにも引用する必要があります。基本的に毎回引用する必要があります。テーブルを作成するときに引用しないことをお勧めします。そうすれば、後で引用する必要がなくなるからです。引用符は、識別子が大文字と小文字を区別することを意味します。MySQL の場合、他のデータベースとは異なり、MySQL が内部的に引用符なしの識別子を小文字に変換するため、機能します。しかし、H2 やその他のデータベースでは機能しません。OTHERTABLE"id"

次の 2 つのステートメントは、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)
);

したがって、2 番目のステートメントで例外が発生した場合は、別の方法で最初のテーブルを作成した可能性があります ( OTHERTABLE)。そして、ここが問題です。

次回、質問する場合create tableは、最初の表のステートメントも含めて、完全なエラー メッセージを投稿してください。

于 2013-05-29T10:45:18.813 に答える