在MODE = MySQL中运行h2不支持MySQL转储

时间:2013-01-24 20:00:35

标签: java mysql integration-testing h2 embedded-database

我正在尝试嵌入h2来测试我的mysql-application(集成测试)

我通过maven添加了com.h2database:h2:1.3.170并运行以下代码:

public class InMemoryTest
{
    @Test
    public void test() throws Exception {
      Class.forName("org.h2.Driver");

      Connection conn = DriverManager.
          getConnection("jdbc:h2:mem:test;MODE=MySQL;IGNORECASE=TRUE;INIT=RUNSCRIPT FROM 'src/test/resources/test.sql'");
    }
}

给了我以下例外:

Syntax error in SQL statement "
CREATE TABLE IF NOT EXISTS ""usr_avatar"" (
  ""usr_avatar_id"" INT(11) NOT NULL AUTO_INCREMENT,
  ""usr_avatar_user_id"" INT(11) NOT NULL,
  ""usr_avatar_img"" BLOB NOT NULL,
  PRIMARY KEY (""usr_avatar_id""),
  UNIQUE KEY ""usr_avatar_id_UNIQUE"" (""usr_avatar_id""),
  UNIQUE KEY ""usr_avatar_user_id_UNIQUE"" (""usr_avatar_user_id""),
  KEY ""usr_user_id"" (""usr_avatar_user_id""),
  KEY ""fk_user_id"" (""usr_avatar_user_id"")
) AUTO_INCREMENT[*]=1  ";

显然,“AUTO_INCREMENT”导致了这个?

由于这是有效的MySQL(我使用MySQL Workbench从我的真实数据库导出转储),我有点困惑,因为h2声称支持MySQL? 以下是.sql中的几行:

DROP TABLE IF EXISTS `usr_avatar`;
CREATE TABLE IF NOT EXISTS "usr_avatar" (
  "usr_avatar_id" int(11) NOT NULL AUTO_INCREMENT,
  "usr_avatar_user_id" int(11) NOT NULL,
  "usr_avatar_img" blob NOT NULL,
  PRIMARY KEY ("usr_avatar_id"),
  UNIQUE KEY "usr_avatar_id_UNIQUE" ("usr_avatar_id"),
  UNIQUE KEY "usr_avatar_user_id_UNIQUE" ("usr_avatar_user_id"),
  KEY "usr_user_id" ("usr_avatar_user_id"),
  KEY "fk_user_id" ("usr_avatar_user_id")
) AUTO_INCREMENT=1 ;

DROP TABLE IF EXISTS `usr_restriction`;
CREATE TABLE IF NOT EXISTS "usr_restriction" (
  "usr_restriction_id" int(11) NOT NULL AUTO_INCREMENT,
  "usr_restriction_user_id" int(11) DEFAULT NULL,
  "usr_restriction_ip" varchar(39) DEFAULT NULL,
  "usr_restriction_valid_from" date NOT NULL,
  "usr_restriction_valid_to" date DEFAULT NULL,
  PRIMARY KEY ("usr_restriction_id"),
  UNIQUE KEY "usr_restriction_id_UNIQUE" ("usr_restriction_id"),
  KEY "user_id" ("usr_restriction_user_id"),
  KEY "usr_user_id" ("usr_restriction_user_id")
) AUTO_INCREMENT=1 ;

我有什么选择?我应该使用不同的软件导出转储并强制它是纯SQL吗?哪个软件可以做到这一点?或者我做错了什么?

3 个答案:

答案 0 :(得分:3)

问题是H2不支持您在SQL语句中指定的AUTO_INCREMENT=1。尝试删除它。我不认为MySQL也是必要的。

答案 1 :(得分:2)

从MySQL导出的源SQL有双引号围绕它的文字。第一个DROP语句也有一个“反向滴答”(`)。但是当H2报告错误时,H2显示由双引号括起来的文字。我认为这是问题所在。

尝试一些事情。首先,在DROP语句中使用反向标记并将其转换为单引号。如果这不起作用,请将所有双引号转换为单引号。如果这不起作用,请删除所有引号。

我认为H2正在尝试创建带有双引号的表作为实际表名/列名的一部分,这导致它轰炸。

答案 2 :(得分:2)

H2并不支持AUTO_INCREMENT=1

请改用:

ALTER TABLE table_name ALTER COLUMN id RESTART WITH 1;