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

Postgres中的部分索引

仲孙雅达
2023-03-14

在我的一个项目中,我有一个表,其中保存了某种设备的固件更新信息。最初,任何固件更新进程都处于排队状态。更新过程可能有其他状态值,例如正在进行、已完成、失败。对于单个设备,可能存在状态为“已完成”和“已失败”的多行(已完成的更新过程,最终状态!)。但在任何时候,处于排队或正在进行状态的每个设备都必须只有一个更新过程——新固件的推出应该只适用于没有“活动/非最终”更新过程的设备。我试图用Postgres的部分索引来实现这个约束,但并没有像我预期的那样奏效。

以下是该表的简化版本:

CREATE TABLE firmware_update_processes
(
    id  uuid DEFAULT uuid_generate_v1(),
    device VARCHAR(10) NOT NULL,
    state VARCHAR (10) NOT NULL DEFAULT 'ENQUEUED',
    PRIMARY KEY (id)
);

以下是唯一的部分索引:

CREATE UNIQUE INDEX unique_non_final_firmware_updates_processes
ON firmware_update_processes (device, state)
WHERE state IN ('ENQUEUED', 'ONGOING');

然后我验证了这个约束,但我仍然能够为给定的设备插入多个“活动/非最终”更新过程。。。

INSERT INTO firmware_update_processes (device, state) VALUES ('device1', 'ENQUEUED');
INSERT INTO firmware_update_processes (device, state) VALUES ('device1', 'ONGOING');

是否有任何-也许是其他-方法来完成这在数据库级别?任何帮助是感激的。

共有1个答案

廖琪
2023-03-14

我认为这应该是:

CREATE UNIQUE INDEX unique_non_final_firmware_updates_processes
ON firmware_update_processes (device)
WHERE state IN ('ENQUEUED', 'ONGOING');

在(设备、状态)上有一个唯一的索引,这将显式地允许每个设备的排队状态和正在进行的状态。由于只有设备上有唯一的索引,我们只允许每个设备处于一种排队状态或进行中状态。

 类似资料:
  • 问题内容: 在稀疏索引文档中,我发现了有关mongodb 3.2部分索引的说明 在版本3.2中进行了更改:从MongoDB 3.2开始,MongoDB提供了创建部分索引的选项。部分索引提供了稀疏索引功能的超集。如果您使用的是MongoDB 3.2或更高版本,则应优先使用部分索引而不是稀疏索引。 部分索引非常有用,我想在项目中使用它们。可以和猫鼬一起使用吗? 问题答案: 在当前的Mongoose版本

  • 问题内容: SQLAlchemy支持在postgresql中创建部分索引。 是否可以通过SQLAlchemy创建部分 唯一 索引 ? 像这样想象一个表/模型: 我想要一个唯一的索引,对于给定的发票,该索引只能有一个“活动”的ScheduledPayment。 我可以在postgres中手动创建它: 我想知道如何使用SQLAlchemy 0.9将其添加到我的SQLAlchemy模型中。 问题答案:

  • 问题内容: 我需要创建电话簿之类的东西。它包含名称和号码。现在,当我键入字母时,应该返回匹配列表。对于下面给出的示例,当我键入H时,应返回包含Harmer,Harris,Hawken,Hosler的列表。当输入Ha时,仅返回Harmer,Harris,Hawken的列表。 知道如何实现吗?提前致谢。 问题答案: 是的,为此,HashMap不是正确的数据结构。正如博佐所说,特里(Trie)是正确的选

  • 问题内容: 我有下表: 除非有人提出一些疯狂的新无麸质饮食来席卷全国,否则大多数情况下,每一行都将被设置为。 我需要能够非常快速地查询该值为true的行。我创建了索引: 它似乎可以工作,但是我不知道如何确定是否仅索引值为true的行。我想确保它不会像在索引任何具有任何值的行时那样愚蠢。 我应该在子句中添加运算符,还是此语法完全有效?希望这不是那些将被否决30次的超级简单的RTFM问题之一。 更新:

  • 问题内容: 我似乎找不到太多的文档。在支持这种查询的PostgreSQL上创建数据库/表的最简单方法是什么?SELECT * FROM table WHERE distance(POINT(0,0),table.location)<= 1000m; 其中POINT(0,0)和table.location应该是经度/纬度对,并且1000m是1000米。我应该如何索引该表?谢谢。 问题答案: Post

  • 典型票务系统的PostgreSQL数据库问题。为什么我的upsert不更新现有票证? 门票表: 代码中开发的约束(不是db枚举类型的一部分): 只能是以下值之一:,或。 之前的门票: 运行此SQL以尝试向上插入第一个失败: 带有错误消息: 错误:不存在与冲突规范匹配的唯一或排除约束 我试着把它改成: 在之前移动子句以触发部分索引查询,但没有效果。 我只想更新“未完成”票证的、和(根据该表中定义的部