使以前存在的外键列在 postgres 中具有唯一约束

Make a previously existing foreign key column have a unique constraint in postgres

我需要为已经存在的 table 创建迁移,以使其外键具有 UNIQUE 约束。我该怎么做?

从我在文档中找到的示例来看,它主要是在创建 table 时完成的。问题是我需要将其添加到已存在且已设置为外键的列中。这是 table 创建时的样子:

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 cannot run inside a transaction block

所以那部分无法完成,但即使只是通过 SQL 完成,第二部分也不起作用,因为它声称 myForeignKeyId 已经存在。即使我添加了 ALTER COLUMN myForeignKeyId,它也只是说该行有错误。

这看起来应该是一个足够简单的操作,我该怎么做?

在进一步挖掘之后发现了一个非常简单的方法来做到这一点,显然最初是偏离目标的。

要向列添加唯一约束:

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

删除它:

ALTER TABLE "myTable"
DROP CONSTRAINT "myUniqueKeyNameOfChoice";