Синтаксическая ошибка Postgres в UNIQUE INDEX - HeidiSQL
HeidiSQL сгенерировал следующий код создания:
CREATE TABLE "books" (
"id" BIGINT NOT NULL,
"creation_date" TIMESTAMP NOT NULL,
"symbol" VARCHAR NOT NULL,
PRIMARY KEY ("id"),
UNIQUE INDEX "symbol" ("symbol")
)
;
COMMENT ON COLUMN "books"."id" IS E'';
COMMENT ON COLUMN "books"."creation_date" IS E'';
COMMENT ON COLUMN "books"."symbol" IS E'';
И когда я пытаюсь отправить, я получаю следующую ошибку:
Это ошибка HeidiSQL с PostgreSQL?
1 ответ
Существует рекомендация о том, как создать UNIQUE INDEX
в PostgreSQL:
Предпочтительным способом добавления уникального ограничения в таблицу является ALTER TABLE ... ADD CONSTRAINT. Использование индексов для реализации уникальных ограничений может рассматриваться как деталь реализации, к которой нельзя обращаться напрямую. Однако следует помнить, что нет необходимости вручную создавать индексы для уникальных столбцов; это просто дублирует автоматически созданный индекс.
Есть несколько способов создания UNIQUE INDEX
на PostgreSQL.
Первый способ, как упоминалось выше, с использованием
ALTER TABLE
на ранее созданной таблице:ALTER TABLE books ADD UNIQUE ("symbol");
ИЛИ ЖЕ
ALTER TABLE books ADD CONSTRAINT UQ_SYMBOL UNIQUE ("symbol")
Примечание: этот подход использует автоматическую генерацию индексов PostgreSQL (то есть PostgreSQL определит, что этот столбец является уникальным, и добавит к нему индекс).
Второй способ использует
CREATE INDEX
:CREATE UNIQUE INDEX "symbol" ON books("symbol");
И последнее, но не менее важное: при создании таблицы вы можете просто опустить
INDEX
ключевое слово и пусть PostgreSQL сделает волшебство (создаст индекс) за вас:CREATE TABLE "books" ( "id" BIGINT NOT NULL, "creation_date" TIMESTAMP NOT NULL, "symbol" VARCHAR NOT NULL, PRIMARY KEY ("id"), UNIQUE ("symbol") );
Примечание: синтаксис
UNIQUE "symbol"("symbol")
может возникнуть путаница с методом 2, так как в этом методе 1 необходимо указывать как таблицу, так и имя столбца (books("symbol")
).
Следовательно, это не ошибка PostgreSQL, а ошибка HeidiSQL.
Изменить: я смог воспроизвести ошибку и открыл проблему на GitHub.