Сделайте так, чтобы ранее существующий столбец внешнего ключа имел уникальное ограничение в postgres - PullRequest
0 голосов
/ 14 января 2020

Мне нужно создать миграцию для уже существующей таблицы, чтобы ее внешний ключ имел ограничение UNIQUE. Как мне это сделать?

Из примеров, которые я нашел в документации, в основном это делается при создании таблицы. Проблема в том, что мне нужно добавить это в столбец, который уже существует и уже задан как внешний ключ. Вот как выглядит таблица при ее создании:

CREATE TABLE IF NOT EXISTS "myTable" (
    "_id" SERIAL NOT NULL,
    "myForeignKeyId" INTEGER NOT NULL,
    "name" VARCHAR(255) NOT NULL,
    CONSTRAINT "pk_myTable" PRIMARY KEY ("_id"),
    CONSTRAINT "fk_myTable_myForeignKeyId" FOREIGN KEY ("myForeignKeyId") REFERENCES "myOtherTable" ("_id")
  );

Что я хочу сделать, так это сделать миграцию уникальной myForeignKeyId. Как мне это сделать?

Я попытался сделать следующее:

CREATE UNIQUE INDEX CONCURRENTLY "myTable_myForeignKeyId" 
ON province ("myForeignKeyId");

ALTER TABLE IF EXISTS "myTable"
ADD CONSTRAINT "myForeignKeyId" 
UNIQUE USING INDEX "myTable_myForeignKeyId";

Во-первых, когда я пытаюсь сделать это в процессе миграции, я получаю сообщение об ошибке:

CREATE INDEX CONCURRENTLY не может быть запущен внутри блока транзакции

Так что эту часть невозможно выполнить, но даже если просто сделать это через SQL, вторая часть также не будет работать, поскольку она требует myForeignKeyId уже существует. Даже если я добавлю ALTER COLUMN myForeignKeyId, он просто скажет, что в этой строке есть ошибка.

Кажется, это должна быть достаточно простая операция, как я могу это сделать?

1 Ответ

0 голосов
/ 15 января 2020

После поиска еще нескольких найденных довольно простых способов сделать это было явно не по назначению.

Чтобы добавить уникальное ограничение для столбца:

ALTER TABLE "myTable"
ADD CONSTRAINT "myUniqueKeyNameOfChoice" UNIQUE ("myColumn");

Чтобы удалить его:

ALTER TABLE "myTable"
DROP CONSTRAINT "myUniqueKeyNameOfChoice";
...