【问题标题】:Make a previously existing foreign key column have a unique constraint in postgres使先前存在的外键列在 postgres 中具有唯一约束
【发布时间】:2020-01-14 18:46:14
【问题描述】:

我需要为已经存在的表创建迁移,以使其外键具有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,它也只是说该行有错误。

这似乎应该是一个足够简单的操作,我该怎么做?

【问题讨论】:

    标签: postgresql database-migration unique-constraint


    【解决方案1】:

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

    向列添加唯一约束:

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

    删除它:

    ALTER TABLE "myTable"
    DROP CONSTRAINT "myUniqueKeyNameOfChoice";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2011-03-30
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多