H2数据库:有关INFORMATION_SCHEMA中主键的信息

时间:2010-10-06 10:00:07

标签: sql primary-key clustered-index h2 create-table

我在H2中创建了下表:

CREATE TABLE TEST
(ID BIGINT NOT NULL PRIMARY KEY)

然后我查看INFORMATION_SCHEMA.TABLES表:

SELECT SQL 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'TEST'

结果:

CREATE CACHED TABLE TEST(
    ID BIGINT NOT NULL
)

然后我查看INFORMATION_SCHEMA.CONSTRAINTS表:

SELECT SQL 
FROM INFORMATION_SCHEMA.CONSTRAINTS
WHERE TABLE_NAME = 'TEST'

结果:

ALTER TABLE TEST 
ADD CONSTRAINT CONSTRAINT_4C 
PRIMARY KEY(ID) 
INDEX PRIMARY_KEY_4C

这些陈述不是我所说的,因此,问题是: TABLES和CONSTRAINS中的信息是否反映了在数据库中执行的真实SQL?

  1. 在原始的CREATE TABLE语句中 没有 CACHED 字。 (不是问题)
  2. 我从未执行 ALTER TABLE .. ADD CONSTRAINT 声明。
  3. 我提出问题的实际原因是我不确定应该执行哪个语句以便保证在聚簇索引中使用主键。 如果你查看我之前的问题H2 database: clustered index support,那么你可以在Thomas Mueller的答案中找到以下陈述:

    如果在创建表后创建主键,则主键存储在新的索引b-tree中。

    因此,如果语句按原样执行,它们在INFORMATION_SCHEMA中显示,则在创建表之后创建主键,因此ID不用于聚簇索引(基本上作为数据b树中的键) 。

    有没有办法可以保证主键在H2中的聚簇索引中使用?

1 个答案:

答案 0 :(得分:2)

  

TABLES和CONSTRAINS中的信息是否反映了在数据库中执行的真实SQL?

是。基本上,这些是打开数据库时运行的语句。

  

如果你看看我之前的问题

答案“如果在创建表后创建主键...”不正确,我现在将其修复为“如果在插入数据后创建主键...”。

  

有没有办法可以保证主键在H2中用作聚簇索引?

现在在H2 documentation“如何在内部存储数据”中更好地描述了这一点:“如果在创建表时指定了BIGINT,INT,SMALLINT,TINYINT类型的单列主键(或者之后)创建表,但在插入任何行之前),此列将用作数据b树的键。“