当前位置: 首页 > 面试题库 >

在非唯一列上创建唯一索引

程凯定
2023-03-14
问题内容

不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表:

CREATE TABLE data (
  id SERIAL
  , day DATE
  , val NUMERIC
);
CREATE INDEX data_day_val_idx ON data (day, val);

我想仅能[快速]查询不同的日子。我知道我可以data_day_val_idx用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。

我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维:

CREATE TABLE days (
  day DATE PRIMARY KEY
);

并在每次插入数据时使用触发器来更新它。


问题答案:

索引只能索引实际的行,不能索引聚合的行。因此,是的,就所需索引而言,创建具有唯一值(如您提到的值)的表是您唯一的选择。使用外键约束从data.day到强制引用完整性days.day。这
也可能 是最佳性能,具体取决于整体情况。

但是,由于这与 性能 有关,因此有另一种解决方案:您可以使用 递归CTE来模拟松散索引扫描:

WITH RECURSIVE cte AS (
   (  -- parentheses required
   SELECT day FROM data ORDER BY 1 LIMIT 1
   )
   UNION ALL
   SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
   FROM   cte  c
   WHERE  c.day IS NOT NULL  -- exit condition
   )
SELECT day FROM cte;

SELECT由于附带了ORDER BYLIMIT子句,因此需要在第一个括号中加上括号。

只需在上有一个普通索引day



 类似资料:
  • 问题内容: 就性能而言,MySQL唯一索引和非唯一索引有什么区别? 假设我要在2列的组合上创建索引,并且该组合是唯一的,但是我创建了一个非唯一的索引。这会对MySQL使用的性能或内存产生重大影响吗? 同样的问题, 主 键和 唯一 索引之间有区别吗? 问题答案: UNIQUE和PRIMARY KEY是 约束 ,而不是索引。尽管大多数数据库通过使用索引来实现这些约束。除了索引之外,约束的额外开销也微不

  • CreateIndexes 根据struct中的tag来创建索引 CreateUniques 根据struct中的tag来创建唯一索引

  • 我试图在我们的COSMOSDB上的一些集合上创建一个唯一的索引。每个MS文档https://docs.microsoft.com/en-us/azure/cosmos-db/mongoDB-indexing:只有当集合为空(不包含任何文档)时,才能创建唯一索引。 因此,我清理了集合上的所有数据,但遇到错误时,消息是: 你知道为什么我会出错吗? 谢谢,

  • 问题内容: 这是我的模型: 每个书的编号从每位作者的1开始并向上递增。因此,我们将有John Grisham撰写的1,2,3本书,George Martin撰写的1..5本书,等等。 我是否可以设置一个唯一的约束条件,以确保我们不会有两本书的作者相同?与相似,但约束仅适用于?的复合 问题答案: 用途:

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

  • 以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。