唯一约束和索引都用于确保数据库表中数据的唯一性。但是,这两种方法之间存在一些关键区别。
唯一约束
CONSTRAINT
关键字在表定义中显式定义。索引
CREATE INDEX
语句创建。根据 Postgres 文档,使用 ALTER TABLE ... ADD CONSTRAINT
是向表添加唯一约束的首选方法。这是因为专门为强制唯一性而创建唯一索引被认为是实现细节,不应直接访问。
性能:通常,唯一约束和唯一索引在查询速度方面的性能相似。但是,部分索引可以提高仅访问数据子集的查询的性能。
外键:唯一约束可以被外键引用,而唯一索引则不能。
约束开销:与唯一索引相比,唯一约束略有开销,因为在插入或更新数据时,它们需要额外的维护操作。
为了说明唯一约束和索引之间的区别,让我们创建一个同时具有唯一约束和唯一索引的表:
<code class="language-sql">CREATE TABLE foo ( id SERIAL PRIMARY KEY, code INTEGER, label TEXT, CONSTRAINT foo_uq UNIQUE (code, label) ); CREATE UNIQUE INDEX foo_idx ON foo (code, label);</code>
唯一约束 (foo_uq) 和唯一索引 (foo_idx) 都将强制执行 (code, label) 组合的唯一性。但是,您应该优先使用唯一约束,因为它是 Postgres 中推荐的方法。
部分索引
要创建部分索引,请在 CREATE INDEX
语句中使用 WHERE
子句:
<code class="language-sql">CREATE UNIQUE INDEX foo_partial_idx ON foo (code) WHERE label IS NOT NULL;</code>
此索引仅应用于 label
不为 NULL
的行。
使用索引添加约束
您不能使用部分索引添加唯一约束。但是,您可以使用现有唯一索引创建唯一约束:
<code class="language-sql">ALTER TABLE foo ADD CONSTRAINT foo_partial_uq UNIQUE USING INDEX foo_partial_idx;</code>
以上是Postgres 唯一约束与索引:什么时候应该使用哪个?的详细内容。更多信息请关注PHP中文网其他相关文章!