Как загрузить mysql dump в базу данных hsqldb?
У меня есть sql файл, который создает базу данных в mysql:
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?
В настоящее время я использую этот код (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
Ответы
Ответ 1
- Удалить все строки SET
- Измените строку командой, которая создает базу данных:
CREATE SCHEMA mydb AUTHORIZATION DBA
- Удалить все
if not exists
- hsqldb не поддерживает эту команду
- Удалите все благодарности (не обязательно, но необходимые для кода, который вы найдете в этом сообщении)
- Удалить все `
- Заменить TINYINT (эквивалент mysql для boolean) с помощью boolean
-
Выполняйте каждую команду отдельно:
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();
Ответ 2
Вы также должны:
- заменить "AUTO_INCREMENT" в CREATE_TABLE на "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:
- На вкладке базы данных добавьте соединение с вашей базой данных (в этом случае MySQL)
- Щелкните правой кнопкой мыши нужную базу данных и нажмите "Копировать DDL".
Ответ 5
Я решил эту проблему, полагаясь на RazorSQL. Это не бесплатно, но с оценочной версией вам достаточно для выполнения преобразования из MySQL в HSQLDB. Он также поддерживает другие преобразования DB.
Единственной проблемой, которую я обнаружил во время преобразования, были первичные ключи. Поэтому в основном, следующий сгенерированный отрывок кода не будет работать для меня:
CREATE TABLE items_fractions (
id INTEGER IDENTITY NOT NULL,
item_id INTEGER NOT NULL,
fraction_id INTEGER NOT NULL,
PRIMARY KEY (id)
);
Мне пришлось удалить бит IDENTITY.