Синтаксическая ошибка 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'';

И когда я пытаюсь отправить, я получаю следующую ошибку:

IMG

Это ошибка HeidiSQL с PostgreSQL?

1 ответ

Решение

Существует рекомендация о том, как создать UNIQUE INDEX в PostgreSQL:

Предпочтительным способом добавления уникального ограничения в таблицу является ALTER TABLE ... ADD CONSTRAINT. Использование индексов для реализации уникальных ограничений может рассматриваться как деталь реализации, к которой нельзя обращаться напрямую. Однако следует помнить, что нет необходимости вручную создавать индексы для уникальных столбцов; это просто дублирует автоматически созданный индекс.

Есть несколько способов создания UNIQUE INDEX на PostgreSQL.

  1. Первый способ, как упоминалось выше, с использованием ALTER TABLE на ранее созданной таблице:

    ALTER TABLE books ADD UNIQUE ("symbol");

    ИЛИ ЖЕ

    ALTER TABLE books ADD CONSTRAINT UQ_SYMBOL UNIQUE ("symbol")

    Примечание: этот подход использует автоматическую генерацию индексов PostgreSQL (то есть PostgreSQL определит, что этот столбец является уникальным, и добавит к нему индекс).

  2. Второй способ используетCREATE INDEX:

    CREATE UNIQUE INDEX "symbol" ON books("symbol");

  3. И последнее, но не менее важное: при создании таблицы вы можете просто опустить 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.

Другие вопросы по тегам