2010-09-28 21 views
14

我有在mysql中創建了一個數據庫的SQL文件:如何將mysql dump加載到hsqldb數據庫?

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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 [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

現在,我想這個文件加載到HSQLDB 2數據庫。我需要在mysql轉儲中更改以將數據加載到hsqldb中?

目前我使用這個代碼(常規)執行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; 

,我得到這個crypting例外,所有的時間:

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 

回答

12
  1. 刪除所有套系
  2. 用創建數據庫的命令更改爲:CREATE SCHEMA mydb AUTHORIZATION DBA
  3. 刪除所有if not exists - HSQLDB不支持此命令
  4. 刪除所有讚揚(不neccesary而是需要你在這個崗位上工作的代碼)
  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(); 
    
+0

Afaik,TINYINT表示一個8位變量(範圍0-255),不是布爾值。 – msteiger 2014-08-13 07:26:10

0

您不必單獨運行每個命令,如果運行HSQLDB正常工作只要所有的標記都是有效的,就立即執行所有腳本。

7

你還必須:

  • 取代「AUTO_INCREMENT」在CREATE_TABLE通過「生成的默認身份」
  • 的「整數」列
  • 移動「默認」的說法取代「INT」創建例如:

從這個:

CT_CLIENT integer NOT NULL DEFAULT '0', 

這樣:

CT_CLIENT integer DEFAULT '0' NOT NULL , 
0

解決了使用IntelliJ IDEA的這個問題:

  1. 在數據庫選項卡,添加(在這種情況下,MySQL的)到你的數據庫的連接
  2. 所需右擊數據庫並點擊「複製DDL」。
0

我依靠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位。

相關問題