【问题标题】:In H2 Database, add index while table creation in single query在H2数据库中,在单个查询中创建表时添加索引
【发布时间】:2014-12-05 09:28:18
【问题描述】:

我正在尝试使用单个查询创建具有不同索引的表,但 H2 给出了错误,例如:

create table tbl_Cust
(
  id int primary key auto_increment not null, 
  fid int,
  c_name varchar(50),
  INDEX (fid)
);

但这会产生错误

Unknown data type: "("; SQL statement:
[Error Code: 50004]
[SQL State: HY004]

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

create INDEX c_fid on tbl_Cust(fid);

我的查询有问题还是 H2 根本不支持在单个查询中创建带有索引的表?

【问题讨论】:

  • create table 声明中没有 index 选项,手册中明确记录了该选项:h2database.com/html/grammar.html#create_table
  • @a_horse_with_no_name 我没有找到说明索引选项不在创建表时的行。你能把那行放在这里吗?
  • 查看语句的语法图(“图”)。里面没有index关键字。
  • @a_horse_with_no_name 好的,谢谢伙计。

标签: sql indexing h2


【解决方案1】:

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

实际上可以执行您编写的完全相同的命令无需任何修改,只要您将 MySQL 模式添加到您的 jdbc url。

这样的示例网址: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)

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

【讨论】:

  • 您的查询不适合我。给出问题中提到的相同错误
  • 请分享您的数据库 URL、您的 sql 查询和您正在使用的 H2 版本。
  • 感谢克里斯蒂安!我使用的是 1.4.193 版本的 H2,它在 MySql 兼容模式下工作起来就像一个魅力。
【解决方案2】:

我可以解决问题。根据 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);

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2019-01-14
    • 2020-08-23
    • 2021-10-30
    • 2014-03-25
    • 2017-07-31
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多