2010-09-28 9 views
14

Ho un file sql che crea un database in mysql:Come caricare mysql dump nel database 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; 

Ora vorrei caricare questo file in hsqldb di database 2. Cosa devo cambiare nel mysql dump per caricare i dati in hsqldb?

Attualmente io uso questo codice (Groovy) per eseguire il file 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; 

e per tutto il tempo ho ottenuto questa eccezione 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 

risposta

12
  1. Rimuovere tutte le righe SET
  2. Modifica una riga con comando che crea un database per: CREATE SCHEMA mydb AUTHORIZATION DBA
  3. Rimuovi tutto if not exists - hsqldb non supporta questo comando
  4. Rimuovere tutti loda (non neccesary ma necessari per il codice che trovate in questo post)
  5. Rimuovi tutti `
  6. Sostituire TINYINT (mysql equivalente per boolean) da booleano
  7. eseguire ogni comando separatamente:

    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 rappresenta una variabile a 8 bit (intervallo 0-255), non un valore booleano. – msteiger

0

Lei non c'è bisogno di eseguire ogni comando separatamente, hsqldb funziona bene se si esegue la script tutti in una volta, purché tutti i token siano validi.

7

Hai anche a:

  • sostituire "AUTO_INCREMENT" in CREATE_TABLE da "generati per impostazione predefinita come identità"
  • sostituire "int" con "integer"
  • mossa "default" dichiarazione nella colonna creazione per esempio:

da questo:

CT_CLIENT integer NOT NULL DEFAULT '0', 

a questo:

CT_CLIENT integer DEFAULT '0' NOT NULL , 
0

risolto questo problema utilizzando IntelliJ IDEA:

  1. Nella scheda del database, aggiungere una connessione al database (MySQL in questo caso)
  2. destro del mouse sul desiderato database e fare clic su "Copia DDL".
0

Ho risolto questo problema facendo affidamento su RazorSQL. Non è gratis, ma con la versione di valutazione hai abbastanza per eseguire la conversione da MySQL a HSQLDB. Supporta anche altre conversioni di database.

L'unico problema rilevato durante la conversione era rappresentato dalle chiavi primarie.Quindi, in pratica, il seguente codice estratto generato non avrebbe corso per me:

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

ho dovuto togliere la punta IDENTITÀ.