更新时间:2024-06-11 GMT+08:00

唯一约束和唯一索引有什么区别?

  • 唯一约束和唯一索引概念上不同

    唯一约束确保一列或者一组列中包含的数据对于表中所有的行都是唯一的。 如果没有声明DISTRIBUTE BY REPLICATION,则唯一约束的列集合中必须包含分布列。

    唯一索引用于限制索引字段值的唯一性,或者是多个字段组合值的唯一性。CREATE UNIQUE INDEX创建唯一索引。

  • 唯一约束和唯一索引功能上不同

    约束主要是为了保证数据的完整性,索引主要是为了辅助查询。

  • 唯一约束和唯一索引使用方法上不同
    1. 唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有NULL。
    2. 创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。GaussDB(DWS)行存表支持唯一约束,而列存表不支持。
    3. 创建一个唯一索引,这个索引独立的、可以单独删除。目前,GaussDB(DWS)只有B-Tree可以创建唯一索引。
    4. 如果一个列上想有约束和索引,且两者可以单独的删除。可以先建唯一索引,再建同名的唯一约束。
    5. 如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错。

示例:创建两个列的复合索引,并不要求是唯一索引。

1
2
CREATE TABLE t (n1 number,n2 number,n3 number,PRIMARY KEY (n3));
CREATE INDEX t_idx ON t(n1,n2);

GaussDB(DWS)支持多个唯一索引。

1
2
CREATE UNIQUE INDEX u_index ON t(n3);
CREATE UNIQUE INDEX u_index1 ON t(n3);

可以使用上述示例创建的索引t_idx来创建唯一约束t_uk,而且它只在列n1上唯一,也就是说唯一约束比索引更加严格。

1
ALTER TABLE t ADD CONSTRAINT t_uk UNIQUE USING INDEX u_index;