【问题标题】:How to load mysql dump to hsqldb database?如何将 mysql 转储加载到 hsqldb 数据库?
【发布时间】:2011-04-18 05:38:48
【问题描述】:

我有一个在 mysql 中创建数据库的 sql 文件:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`machine`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`machine` (
  `id` INT NOT NULL ,
  `name` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) );


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

现在我想将此文件加载到 hsqldb 2 数据库中。我需要在 mysql 转储中进行哪些更改才能将数据加载到 hsqldb 中?

目前我使用这段代码(groovy)来执行sql文件:

def embeddedDbSettings = [url:'jdbc:hsqldb:file:mydb', user:'sa', password:'', driver:'org.hsqldb.jdbcDriver'];
sql =  Sql.newInstance(embeddedDb);
sql.executeInsert new File("./sql/create_database.sql").text;

而且我一直得到这个加密异常:

Exception in thread "main" java.sql.SQLException: unknown token
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
    at groovy.sql.Sql.executeInsert(Sql.java:1440)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:229)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at de.hpi.ecir.eval_script.Convert2Excel.main(Convert2Excel.groovy:37)
Caused by: org.hsqldb.HsqlException: unknown token
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ParserBase.read(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 13 more

【问题讨论】:

    标签: mysql groovy migration hsqldb


    【解决方案1】:
    1. 删除所有 SET 行
    2. 将创建数据库的命令更改为:CREATE SCHEMA mydb AUTHORIZATION DBA
    3. 删除所有if not exists - hsqldb 不支持此命令
    4. 删除所有推荐(不是必需的,但您在本文中找到的代码需要)
    5. 删除所有 `
    6. 用布尔值替换 TINYINT(mysql 等效于布尔值)
    7. 分别执行每个命令:

      String[] commands = new File("./sql/create_database.sql").text.split(";");
      
      for(String command: commands)
      {
      
       // new line is a delimiter in hsqldb
      
        sql.execute command.replace("\n", " ");
      }
      
      // remember to call shutdown otherwise hsqldb will not save your data
      sql.execute "SHUTDOWN"
      sql.close();
      

    【讨论】:

    • Afaik,TINYINT 表示一个 8 位变量(范围 0-255),而不是布尔值。
    【解决方案2】:

    你还必须:

    • 将 CREATE_TABLE 中的“AUTO_INCREMENT”替换为“GENERATED BY DEFAULT AS IDENTITY”
    • 将“int”替换为“integer”
    • 在列创建中移动“默认”语句,例如:

    从此:

    CT_CLIENT integer NOT NULL DEFAULT '0',
    

    到这个:

    CT_CLIENT integer DEFAULT '0' NOT NULL ,
    

    【讨论】:

      【解决方案3】:

      您不必单独运行每个命令,如果您一次运行所有脚本,只要您的所有令牌都有效,hsqldb 就可以正常工作。

      【讨论】:

        【解决方案4】:

        使用 IntelliJ IDEA 解决了这个问题:

        1. 在数据库选项卡中,添加到数据库的连接(在本例中为 MySQL)
        2. 右键单击所需的数据库,然后单击“复制 DDL”。

        【讨论】:

          【解决方案5】:

          我依靠RazorSQL 解决了这个问题。它不是免费的,但使用评估版,您可以执行从 MySQL 到 HSQLDB 的转换。它还支持其他数据库转换。

          我在转换过程中发现的唯一问题是主键。所以基本上,以下生成的代码摘录不会为我运行:

          CREATE TABLE items_fractions (
            id INTEGER IDENTITY NOT NULL,
            item_id INTEGER NOT NULL,
            fraction_id INTEGER NOT NULL,
            PRIMARY KEY (id)
          );
          

          我不得不删除 IDENTITY 位。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-14
            • 1970-01-01
            • 1970-01-01
            • 2014-11-14
            • 1970-01-01
            相关资源
            最近更新 更多