2016-02-27 34 views
1

以下SQL命令实际上是针对MySQL的。我不是SQL专家,对H2不太了解。我的Spring应用程序抛出异常,因为无法创建user_roles表。它与fk_username_idx一个问题:H2不兼容的SQL命令

DROP TABLE IF EXISTS users; 
    DROP TABLE IF EXISTS user_roles; 

    CREATE  TABLE users (
  userid VARCHAR(5) NOT NULL, 
  username VARCHAR(45) NOT NULL , 
  password VARCHAR(60) NOT NULL , 
  enabled TINYINT NOT NULL DEFAULT 1 , 
  PRIMARY KEY (userid)); 
    
    CREATE TABLE user_roles (
  user_role_id int(11) NOT NULL AUTO_INCREMENT, 
  userid varchar(5) NOT NULL, 
  role varchar(45) NOT NULL, 
  PRIMARY KEY (user_role_id), 
  UNIQUE KEY uni_username_role (role,userid), 
  KEY fk_username_idx (userid), 
  CONSTRAINT fk_username FOREIGN KEY (userid) REFERENCES users (userid)); 

错误日志:

Caused by: org.h2.jdbc.JdbcSQLException: Unbekannter Datentyp: "FK_USERNAME_IDX" 
Unknown data type: "FK_USERNAME_IDX"; SQL statement: 
   CREATE TABLE user_roles (  user_role_id int(11) NOT NULL AUTO_INCREMENT,   userid varchar(5) NOT NULL,   role varchar(45) NOT NULL,   PRIMARY KEY (user_role_id),   UNIQUE KEY uni_username_role (role,userid),   KEY fk_username_idx (userid),   CONSTRAINT fk_username FOREIGN KEY (userid) REFERENCES users (userid)) [50004-191] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 
    at org.h2.message.DbException.get(DbException.java:179) 
    at org.h2.message.DbException.get(DbException.java:155) 
    at org.h2.command.Parser.parseColumnWithType(Parser.java:4059) 
    at org.h2.command.Parser.parseColumnForTable(Parser.java:3922) 
    at org.h2.command.Parser.parseCreateTable(Parser.java:5864) 
    at org.h2.command.Parser.parseCreate(Parser.java:4217) 
    at org.h2.command.Parser.parsePrepared(Parser.java:360) 
    at org.h2.command.Parser.parse(Parser.java:315) 
    at org.h2.command.Parser.parse(Parser.java:287) 
    at org.h2.command.Parser.prepareCommand(Parser.java:252) 
    at org.h2.engine.Session.prepareLocal(Session.java:560) 
    at org.h2.engine.Session.prepareCommand(Session.java:501) 
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188) 
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:170) 
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158) 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:472) 
    ... 47 more 
+0

“它与fk_username_idx一个问题” - 发表您的错误。 –

回答

1
  1. 你确定你的H2运行在MySQL的兼容性模式?先检查一下。通过查看连接字符串。例如像这样:

    final SimpleDriverDataSource ds = new SimpleDriverDataSource(); 
    ds.setDriverClass(Driver.class); 
    ds.setUrl("jdbc:h2:mem:test;MODE=mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"); 
    ds.setUsername("sa"); 
    ds.setPassword(""); 
    
  2. FOREIGN KEY fk_username_idx (userid),不H2 suppported。在这里删除FOREIGN

然后它会工作

+0

您的建议解决方案解决了问题。谢谢! – Marcel

相关问题