【问题标题】:Postgres Unique Constraint on two columns: Integer and Boolean两列上的 Postgres 唯一约束:整数和布尔值
【发布时间】:2012-06-13 12:33:25
【问题描述】:

我想找到一种方法在我的数据库中存储一个主题的多个地址,每个主题只有一个默认地址。

长话短说,假设我们有一张桌子:

CREATE TABLE test
(
  id integer NOT NULL,
  active boolean NOT NULL,
  CONSTRAINT pk_id PRIMARY KEY (id)
)

对于表中的每个id,最多只能有1个真正的活跃值。

我怎样才能做到这一点?

谢谢。

【问题讨论】:

  • 实际上你不必做 任何事情,因为 id 作为主键使其独一无二,所以 不能 有两行相同的 ID。
  • 如果您不想将id 作为主要的,那么您需要编写一个触发器:postgresql.org/docs/9.1/static/sql-createtrigger.html,但这可能不是您想要的。

标签: postgresql constraints unique


【解决方案1】:

Partial index 是你想要的:

create unique index some_index on test (id) where active;

@ThiefMaster 声明主索引应该被删除。

【讨论】:

  • 谢谢。这很好,因为我的 PK 是此表中的地址 PK。这也有效: CREATE UNIQUE INDEX some_index ON test USING btree (active, id) WHERE active;
  • 您应该注意到,您在查询中真正改变的唯一一件事就是将活动添加到索引。虽然对于索引主题刚刚添加了一些膨胀的所有字段都是有效的。
  • PK 只是 UNIQUE 和 NOT NULL 约束的总和。
【解决方案2】:

在这个问题的情况下,如前所述,不需要它。

但仅供参考,您可以将约束设置为 2 个或更多(非 PrimaryKey)具有不同类型的列。例如:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column);

有关详细信息,请参阅 Constraints 的 Postgres 文档“唯一约束”部分。引用:

如果唯一约束引用一组列,则列以逗号分隔…

这指定指定列中的值组合在整个表中是唯一的,尽管任何一列不必是(并且通常不是)唯一的。

注意: partial index 设置建立在表子集上的索引,其用途完全不同。

【讨论】:

  • 我认为你的解决方案他不能有多个非活动地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2015-03-06
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多