PostgreSQL: Можете ли вы создать индекс в определении CREATE TABLE?

105

Я хочу добавить индексы к некоторым столбцам таблицы при создании. Есть ли способ добавить их в определение CREATE TABLE или мне нужно добавить их позже с другим запросом?

CREATE INDEX reply_user_id ON reply USING btree (user_id);
Xeoncross
источник

Ответы:

120

Кажется, нет никакого способа указать индекс в CREATE TABLEсинтаксисе. Однако PostgreSQL по умолчанию создает индекс для уникальных ограничений и первичных ключей, как описано в этом примечании :

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

Кроме того, если вам нужен неуникальный индекс, вам нужно будет создать его самостоятельно в отдельном CREATE INDEXзапросе.

избавляться
источник
Спасибо, я не знал об уникальном ограничении при создании индекса.
Xeoncross
Обратите внимание, что PostgreSQL поддерживает обновления схемы транзакций - рекомендуется использовать BEGIN / COMMIT для операторов CREATE TABLE и CREATE INDEX, если вы хотите, чтобы создание общей таблицы в целом было успешным или не удалось в целом.
mindplay.dk
22

Нет.

Однако вы можете создавать uniqueиндексы при создании, но это потому, что они классифицируются как ограничения . Вы не можете создать «общий» индекс.

Богемный
источник
6

Питер Краусс ищет канонический ответ:

Существует СОВРЕМЕННЫЙ СИНТАКСИС (2020 год), поэтому, пожалуйста, объясните и покажите примеры, совместимые с postgresql.org/docs/current/sql-createtable.html

Вы ищете определение встроенного индекса , которое недоступно для PostgreSQL до текущей версии 12. За исключением ограничения UNIQUE / PRIMARY KEY, которое создает для вас базовый индекс.

СОЗДАТЬ ТАБЛИЦУ

[CONSTRAINT имя_ограничения] {CHECK (выражение) [NO INHERIT] | UNIQUE (имя_столбца [, ...]) параметры_индекса | ПЕРВИЧНЫЙ КЛЮЧ (имя_столбца [, ...]) параметры_индекса |


Пример синтаксиса определения встроенного столбца (здесь SQL Server):

CREATE TABLE tab(
  id INT PRIMARY KEY,                            -- constraint
  c INT INDEX filtered (c) WHERE c > 10,         -- filtered index
  b VARCHAR(10) NOT NULL INDEX idx_tab_b,        -- index on column
  d VARCHAR(20) NOT NULL,
  INDEX my_index NONCLUSTERED(d)                 -- index on column as separate entry
);

db <> демо скрипта

Обоснование их введения довольно интересно. Что такое встроенные индексы? Автор Фил Фактор

Лукаш Шозда
источник
Привет, решено (!). Можете ли вы добавить что-нибудь о более сложном случае, например b VARCHAR(10) NOT NULL INDEX idx_tab_b gin (b gin_trgm_ops).. как добавить больше параметров без повторения имени столбца?
Питер Краусс,
@PeterKrauss Я привел пример для SQL Server, который не поддерживает gin_trgm_ops.
Лукаш Шозда,
Привет, @LukaszSzozda Что касается синтаксиса, возможно, вы можете попытаться преобразовать любой комплекс CREATE INDEX idxName ON tableName USING MethodName (fieldName optionName);в синтаксис определения встроенного индекса . PS: этот вопрос касается PostgreSQL, а не Microsoft-SQL-Server (см. Теги).
Питер Краусс
@PeterKrauss Я полностью осознаю, что этот вопрос касается PostgreSQL. Я просто дал вам правильное название этой функции и показал пример, как это может выглядеть. Будем надеяться, что больше РСУБД будут поддерживать индексы inlinde в будущем :)
Лукаш Шозда,