使以前存在的外键列在 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";
我需要为已经存在的 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";