2010-09-28 30 views
14

Tôi có một tập tin sql tạo ra một cơ sở dữ liệu trong mysql:Làm thế nào để tải mysql dump vào cơ sở dữ liệu 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; 

Bây giờ tôi muốn tải tập tin này vào cơ sở dữ liệu HSQLDB 2. Tôi cần phải thay đổi gì trong bãi chứa mysql để tải dữ liệu vào hsqldb?

Hiện nay tôi sử dụng mã này (groovy) để chạy 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; 

và tất cả thời gian tôi đã crypting này ngoại lệ:

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 

Trả lời

12
  1. Hủy bỏ tất cả các dòng SET
  2. Thay đổi dòng có lệnh tạo cơ sở dữ liệu thành: CREATE SCHEMA mydb AUTHORIZATION DBA
  3. Xóa tất cả if not exists - HSQLDB không hỗ trợ lệnh này
  4. Hủy bỏ tất cả nghênh (không neccesary nhưng cần thiết cho việc mã bạn thấy trong bài viết này)
  5. Hủy bỏ tất cả '
  6. Thay TINYINT (mysql tương đương cho boolean) bởi boolean
  7. Execute mỗi lệnh riêng:

    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 đại diện cho biến 8 bit (khoảng 0-255), không phải là boolean. – msteiger

0

bạn không cần phải chạy từng lệnh riêng biệt, HSQLDB hoạt động tốt nếu bạn chạy tập lệnh cùng một lúc, miễn là tất cả mã thông báo của bạn đều hợp lệ.

7

Bạn cũng phải:

  • thay thế "AUTO_INCREMENT" trong create_table bởi "Generated by default AS SẮC"
  • thay thế "int" bởi "số nguyên"
  • di chuyển "mặc định" tuyên bố trong cột tạo ví dụ:

từ này:

CT_CLIENT integer NOT NULL DEFAULT '0', 

này:

CT_CLIENT integer DEFAULT '0' NOT NULL , 
0

Giải Quyết vấn đề này bằng IntelliJ IDEA:

  1. Trong tab cơ sở dữ liệu, thêm một kết nối đến cơ sở dữ liệu của bạn (MySQL trong trường hợp này)
  2. Nhấp chuột phải vào mong muốn và nhấp vào "Sao chép DDL".
0

Tôi đã giải quyết vấn đề này bằng cách dựa vào RazorSQL. Nó không phải là miễn phí, nhưng với phiên bản đánh giá bạn có đủ để thực hiện chuyển đổi từ MySQL sang HSQLDB. Nó cũng hỗ trợ các chuyển đổi DB khác.

Vấn đề duy nhất tôi phát hiện trong quá trình chuyển đổi là các khóa chính.Vì vậy, về cơ bản, đoạn mã được tạo sau đây sẽ không chạy cho tôi:

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

Tôi phải xóa bit IDENTITY.

Các vấn đề liên quan