2010-09-28 17 views
14

Mam plik SQL, który tworzy bazę danych w MySQL:Jak załadować plik mysql dump do bazy danych 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; 

Teraz chciałbym, aby załadować ten plik do hsqldb 2 bazy danych. Co muszę zmienić w zrzucie mysql, aby załadować dane do hsqldb?

Obecnie używam tego kodu (groovy), aby uruchomić plik 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; 

i cały czas mam to CryptoAPI wyjątek:

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 

Odpowiedz

12
  1. usunąć wszystkie linie SET
  2. Zmień linię za pomocą komendy, która tworzy bazę danych: CREATE SCHEMA mydb AUTHORIZATION DBA
  3. Usuń wszystko if not exists - hsqldb nie obsługuje tej komendy
  4. Usuń wszystkie pochwala (nie neccesary ale potrzebne do kodu można znaleźć w tym poście)
  5. usunąć wszystkie `
  6. Wymień TINYINT (MySQL odpowiednika Boolean) boolowskimi
  7. wykonać każde polecenie oddzielnie:

    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 reprezentuje 8-bitową zmienną (zakres 0-255), a nie boolowską. – msteiger

0

nie trzeba uruchamiać każde polecenie oddzielnie hsqldb działa dobrze, jeśli uruchomić skrypty naraz, o ile wszystkie tokeny są ważne.

7

mieć również do:

  • zastąpić "AUTO_INCREMENT" w create_table przez "generated domyślnie, ponieważ tożsamość"
  • zastąpić "int" przez "całkowitą"
  • ruch "default" Oświadczenie w kolumnie utworzenie np

z tego:

CT_CLIENT integer NOT NULL DEFAULT '0', 

do tego:

CT_CLIENT integer DEFAULT '0' NOT NULL , 
0

rozwiązać ten problem przy użyciu IntelliJ IDEA:

  1. W zakładce bazy, dodać połączenie do bazy danych (MySQL w tym przypadku)
  2. prawym przyciskiem myszy żądany bazę danych i kliknij "Kopiuj DDL".
0

Rozwiązałem ten problem, powołując się na RazorSQL. Nie jest za darmo, ale z wersją ewaluacyjną wystarcza do przeprowadzenia konwersji z MySQL na HSQLDB. Obsługuje również inne konwersje DB.

Jedynym problemem, jaki wykryłem podczas konwersji, były klucze podstawowe.Zasadniczo poniższy wygenerowany fragment kodu nie był dla mnie przeznaczony:

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

Musiałem usunąć bit IDENTITY.

Powiązane problemy