更新时间:2024-06-21 GMT+08:00
唯一约束和唯一索引有什么区别?
- 唯一约束和唯一索引概念上不同
唯一约束确保一列或者一组列中包含的数据对于表中所有的行都是唯一的。 如果没有声明DISTRIBUTE BY REPLICATION,则唯一约束的列集合中必须包含分布列。
唯一索引用于限制索引字段值的唯一性,或者是多个字段组合值的唯一性。CREATE UNIQUE INDEX创建唯一索引。
- 唯一约束和唯一索引功能上不同
- 唯一约束和唯一索引使用方法上不同
- 唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有NULL。
- 创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。GaussDB(DWS)行存表支持唯一约束,而列存表不支持。
- 创建一个唯一索引,这个索引独立的、可以单独删除。目前,GaussDB(DWS)只有B-Tree可以创建唯一索引。
- 如果一个列上想有约束和索引,且两者可以单独的删除。可以先建唯一索引,再建同名的唯一约束。
- 如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错。
示例:创建两个列的复合索引,并不要求是唯一索引。
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; |
父主题: 数据库使用
数据库使用 所有常见问题
- 如何调整分布列?
- 如何查看和设置数据库的字符集编码格式
- 如何处理建表时date类型字段自动转换为timestamp类型的问题?
- 是否需要定时对常用的表做VACUUM FULL和ANALYZE操作?
- GaussDB(DWS)数据库设置主键后还需要设置分布键吗?
- GaussDB(DWS)是否兼容PostgreSQL的存储过程?
- 如何理解分区表、数据分区和分区键?
- 如何导出某张表结构?
- 是否有高效的删除表数据的方法?
- 如何查看外部表信息?
- 如果建表时没有指定分布列,数据会怎么存储?
- 如何将联结查询的null结果替换成0?
- 如何查看表是行存还是列存?
- GaussDB(DWS)列存表的常用信息查询
- GaussDB(DWS)查询时索引失效场景解析
- 如何使用自定义函数改写CRC32()函数
- 以pg_toast_temp*或pg_temp*开头的Schema是什么?
- GaussDB(DWS)查询时结果不一致的常见场景和解决方法
- 哪些系统表不能做VACUUM FULL
- 语句处于idle in transaction状态常见场景
- GaussDB(DWS)如何实现行转列及列转行?
- 唯一约束和唯一索引有什么区别?
- 函数和存储过程有什么区别?
- 如何删除重复的表数据?
more