在H2数据库中,在单个查询中创建表时添加索引

10 sql indexing h2

我试图用单个查询创建具有不同索引的表,但H2给出了Error例如:

create table tbl_Cust
(
  id int primary key auto_increment not null, 
  fid int,
  c_name varchar(50),
  INDEX (fid)
);
Run Code Online (Sandbox Code Playgroud)

但这会给出错误

Unknown data type: "("; SQL statement:
[Error Code: 50004]
[SQL State: HY004]
Run Code Online (Sandbox Code Playgroud)

因此,我必须运行2个不同的查询来创建带有索引的表.第一个查询创建表,然后第二个查询添加索引

create INDEX c_fid on tbl_Cust(fid);
Run Code Online (Sandbox Code Playgroud)

我的查询中有什么问题,或者H2只是不支持在单个查询中创建带索引的表吗?

Chr*_*HON 12

有趣的问题.解决方案更有趣,因为它涉及MySQL兼容模式.

实际上,您可以执行与您编写的完全相同的命令而无需任何修改,前提是您只需将您的jdbc url添加到MySQL模式即可.

示例网址如下: jdbc:h2:mem:;mode=mysql

SQL仍然是:

create table tbl_Cust ( id int primary key auto_increment not null, fid int, c_name varchar(50), INDEX (fid) ); Update count: 0 (15 ms)

太糟糕了我之前没有看到这个问题...希望有一天解决方案可能对某人有用:-)


Kit*_*tte 5

我可以解决问题。根据 http://www.h2database.com/html/grammar.html#create_index 我修改了查询。它适用于我的 H2 服务器。

CREATE TABLE subscription_validator (
    application_id int(11) NOT NULL,
    api_id int(11) NOT NULL,
    validator_id int(11) NOT NULL,
    PRIMARY KEY (application_id,api_id),
    CONSTRAINT subscription_validator_ibfk_1 FOREIGN KEY (validator_id) REFERENCES validator (id) ON UPDATE CASCADE
  );

CREATE INDEX validator_id ON subscription_validator(validator_id);
Run Code Online (Sandbox Code Playgroud)