当前位置: 首页 > 知识库问答 >
问题:

在 postgresql 中,如何使“名称”仅在“已删除”为假时才是唯一的?

罗智志
2023-03-14

我有下表

CREATE TABLE "prm_project_service_product_and_services" (
  "id" BIGSERIAL NOT NULL,
  "name" VARCHAR(60) NOT NULL,
  "note" VARCHAR(256) NOT NULL,
  "version" BIGINT DEFAULT NULL,
  "created_date" TIMESTAMP DEFAULT NULL,
  "created_by_id" BIGINT DEFAULT NULL,
  "last_modified_date" TIMESTAMP DEFAULT NULL,
  "last_modified_by_id" BIGINT DEFAULT NULL,
  "deleted" BOOLEAN NOT NULL DEFAULT FALSE,
  PRIMARY KEY ("id"),
  CONSTRAINT project_service_product_and_services_unique UNIQUE ("name")
);

只有当<code>删除的<code>为<code>false<code>时,我才想使<code>名称<code>唯一,这可能吗?

共有1个答案

凌经赋
2023-03-14

您可以使用部分唯一索引:

create unique index punq_prm_project_service_product_and_services
    on prm_project_service_product_and_services(name)
    where not deleted;

如文档中所述,这必须使用索引而不是唯一约束来完成:

仅覆盖某些行的唯一性限制不能写成unique约束,但可以通过创建唯一的部分索引来强制实施这种限制。

 类似资料:
  • 问题内容: 我想将唯一键放到如何? 问题答案: 只需使用以下SQL脚本即可删除MySQL中的索引:

  • 问题内容: 我遇到了一个看似简单的问题:在熊猫数据框中删除唯一的行。基本上与的相反。 假设这是我的数据: 当A和B唯一时,我想删除行,即我只保留行1和2。 我尝试了以下方法: 但是我只能得到第2行,因为唯一性是0、1和3! 问题答案: 选择所有重复行的解决方案: 您可以使用子集和参数来选择所有重复项: 解决方案: 对所有唯一行进行了一些修改的解决方案:

  • 问题内容: 我尝试删除h2中以前创建为的列的唯一约束。 我试过了: 但是没有成功(如下): 如何正确消除此约束? 顺便一提: 似乎返回正确的输出。 问题答案: 在SQL语言中,标识符名称不能是表达式。您需要运行两个语句: 然后获取标识符名称,并运行该语句

  • 问题内容: 这是完整的代码: 什么也没出现。但是,如果我删除第一行(),则所有页面均按预期绿色。 我有两个问题: 如何在不删除标签的情况下填写页面? 为什么要删除使其起作用? 问题答案: CSS 属性,百分比值和DOCTYPE 问题的 第一部分 询问如何对您的身高施加100%的高度,其他人多次回答。本质上,在根元素上声明高度: 问题的 第二部分 受到的关注要少得多。我会尽力回答。 为什么去除mak

  • 有人能告诉我如何删除下划线从我的应用程序名称。 当我使用模拟器或真正的手机(iPhone或android)时,屏幕中的名称显示为“my_app_name”--这看起来很奇怪。 我试图更改。yaml文件中的名称--但它不允许名称中有空格。 这是无法改变的。它不接受空格。 谢谢

  • 当尝试使用PostgreSQL执行时,我遇到了一个我不理解的行为。文档似乎指示语句的冲突目标可以是索引表达式或约束名称。但是,当试图引用约束名称时,我得到了一个“列...不存在”错误。 我的第一次尝试是创建一个索引,它可以很好地处理约束推理: 在描述上表时,我在“索引”下看到了以下内容: 我的第二次尝试是将唯一约束显式地放在创建表中: 在描述上表时,“索引:”的输出略有不同(“唯一约束”与前一示例