我有一个在mysql中创建数据库的sql文件:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@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 SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_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
答案 0 :(得分:13)
CREATE SCHEMA mydb AUTHORIZATION DBA
if not exists
- hsqldb不支持此命令分别执行每个命令:
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();
答案 1 :(得分:7)
您还必须:
来自:
CT_CLIENT integer NOT NULL DEFAULT '0',
到此:
CT_CLIENT integer DEFAULT '0' NOT NULL ,
答案 2 :(得分:0)
您不必单独运行每个命令,只要您的所有令牌都有效,hsqldb就可以一次运行所有脚本。
答案 3 :(得分:0)
使用IntelliJ IDEA解决了这个问题:
答案 4 :(得分: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位。