mysql - H2 不兼容的 SQL 命令

标签 mysql sql h2

下面的SQL命令其实是针对MySQL的。我不是 SQL 专家,对 H2 了解不多。我的 Spring 应用程序抛出异常,因为无法创建 user_roles 表。 fk_username_idx 有问题:

  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

最佳答案

  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 支持。在此处删除 FOREIGN

然后就可以了

关于mysql - H2 不兼容的 SQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676516/

相关文章:

mysql - 如何对行组执行 'WHERE'?

php - 准备好的语句不适用于 ALTER 表查询

sql - 在 SQL 查询中使用 REPLACE 来获取换行符/回车符

java - 恢复h2数据库

spring-boot - 未找到 H2 数据库

mysql - 复杂的 DELETE SQL 查询

java - Java程序输出错误的数据库记录数

mysql - char 与 varchar 用于法语口音(多字节字符)

sql - MYSQL:如何创建一个 MySQL 表,字段的默认值是函数的输出

hibernate - 如何动态/以编程方式配置 hibernate 以使用 h2 数据库 jndi 连接池?