PostgreSQL: Чи можете ви створити індекс у визначенні CREATE TABLE?


104

Я хочу додати індекси до деяких стовпців таблиці створення. Чи є спосіб додати їх до визначення CREATE TABLE або я повинен додати їх після іншого запиту?

CREATE INDEX reply_user_id ON reply USING btree (user_id);

Відповіді:


117

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

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

Крім цього, якщо ви хочете унікальний індекс, вам потрібно буде створити його самостійно в окремому CREATE INDEXзапиті.


Дякую, я не знав про унікальне обмеження створення індексу.
Xeoncross

Зауважте, що PostgreSQL підтримує оновлення схем транзакцій - це гарна ідея ЗАПУСКАТИСЯ / КОМІТУВАТИ навколо ваших операцій CREATE TABLE і CREATE INDEX, якщо ви хочете, щоб створення загальної таблиці в цілому успішно працювало або провалювалося в цілому.
mindplay.dk

22

Немає.

Однак ви можете створювати uniqueіндекси у створенні, але це тому, що вони класифікуються як обмеження . Ви не можете створити "загальний" індекс.


5

Пітер Краус шукає канонічну відповідь:

Є СУЧАСНИЙ СИНТАКС (рік 2020), тому, будь ласка, поясніть та покажіть приклади, сумісні з postgresql.org/docs/current/sql-createtable.html

Ви шукаєте вбудоване визначення індексу , яке недоступне для PostgreSQL до поточної версії 12. За винятком УНІКАЛЬНОГО / ОСНОВНОГО обмеження, що створює базовий індекс для вас.

СТВОРИТИ ТАБЛИЦЮ

[CONSTRAINT constraint_name] {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 <> скриптова демонстрація

Обґрунтування їх введення є досить цікавим Що таке Inline Indexes? Філ Фактор


Привіт, вирішено (!). Ви можете додати щось про більш складний випадок, наприклад 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-сервера (див. Теги).
Пітер Краус

@PeterKrauss Я цілком усвідомлюю, що це питання стосується PostgreSQL. Я щойно дав вам належну назву цієї функції та показав приклад, як це могло виглядати. Будемо сподіватися, що більше RDBMS підтримуватимуть індекси інлінда в майбутньому :)
Лукаш Шозда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.