База данных H2: информация о первичном ключе в INFORMATION_SCHEMA - PullRequest
1 голос
/ 06 октября 2010

Я создаю следующую таблицу в 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 оператор.

Фактическая причина, по которой я задаю этот вопрос, заключается в том, что я не уверен, какой оператор следует выполнить, чтобы гарантировал , что первичный ключ используется в кластерном индексе. Если вы посмотрите на мой предыдущий вопрос База данных H2: поддержка кластеризованного индекса , то в ответе Томаса Мюллера вы можете найти следующее утверждение:

Если первичный ключ создан после создания таблицы , то первичный ключ сохраняется в новом индексном b-дереве.

Поэтому, если операторы выполняются как таковые, они отображаются в INFORMATION_SCHEMA, тогда первичный ключ создается после создания таблицы и, следовательно, ID не используется в кластеризованном индексе (в основном, как ключ в b-дереве данных) ,

Есть ли способ, как можно гарантировать, что первичный ключ используется в кластеризованном индексе в H2?

1 Ответ

2 голосов
/ 06 октября 2010

Является ли информация в TABLES и CONSTRAINS отражением реального SQL, который был выполнен в базе данных?

Да. По сути, это те операторы, которые запускаются при открытии базы данных.

Если вы посмотрите на мой предыдущий вопрос

Ответ «Если первичный ключ создан после того, как таблица была создана ...» был неправильным, я теперь исправил его как «Если первичный ключ создан после того, как данные были вставлены ...».

Есть ли способ, как можно гарантировать, что первичный ключ используется в качестве кластерного индекса в H2?

Теперь это лучше описано в документации H2 в разделе «Как данные хранятся внутри»: «Если при создании таблицы указан первичный ключ одного столбца типа BIGINT, INT, SMALLINT, TINYINT ( или только после создания таблицы, но до вставки каких-либо строк), этот столбец используется в качестве ключа b-дерева данных. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...