数据库中“约束”和“索引”的区别

数据库中“约束”和“索引”的区别,第1张

根据 《MySQL技术内幕》 中的解释:

那么,我们需要先理解 “什么是数据完整性”

MySQL中InnoDB引擎是通过B+树这种数据结构进行数据存取的,而“索引”就是B+树的子叶结点(非树叶)。我们说InnoDB基于B+树查找数据,也可以说基于索引查找数据。利用好索引可以大大提高查询的性能。

最后,再来理解一下开头的那句话。

约束是一个 逻辑概念 ,它更多是指一种功能,用来保证数据完整性。索引是一个数据结构,因为索引是B+树的子叶结点。 当用户创建了唯一索引就创建了唯一的约束,我们创建了索引这个数据结构,起到了唯一约束的这个功能从而保证了数据完整性。

以上是我看书时个人观点的总结,仅供参考

“唯一性约束”和“唯一性索引”是不同的。

一、 建立唯一性约束的语法,使用create table或者alter table

1. 在字段级约束定义

-- 命名

create table tmp_table

(

a int constraint pk_tmp_table_a primary key,

b varchar(10) constraint uq_tmp_table_b unique

)

-- 不命名

create table tmp_table

(

a int primary key,

b varchar(10) unique

)

2. 在表约束定义

-- 命名

create table tmp_table

(

a int,

b varchar(10),

constraint pk_tmp_table_a primary key(a),

constraint uq_tmp_table_b unique(b ASC)

)

-- 不命名

create table tmp_table

(

a int,

b varchar(10),

primary key(a),

unique(b ASC)

)

二、 建立唯一性索引的语法,使用create index

-- 必须命名

CREATE UNIQUE NONCLUSTERED INDEX xak_tmp_table_b ON tmp_table(b DESC)

--不指定[CLUSTERED | NONCLUSTERED],缺省为NONCLUSTERED(非聚集)

三、当在表中创建主键约束或者唯一性键约束时,SQL Server自动创建一个唯一性索引

这是以上脚本建立的约束:

constraint_typeconstraint_nameconstraint_keys

PRIMARY KEY (clustered)pk_tmp_table_aa

UNIQUE (non-clustered)uq_tmp_table_bb

这是索引:

index_nameindex_descriptionindex_keys

pk_tmp_table_aclustered, unique, primary key located on PRIMARYa

uq_tmp_table_bnonclustered, unique, unique key located on PRIMARYb

xak_tmp_table_bnonclustered, unique located on PRIMARYb(-)

可以看出,为主键和唯一性约束自动建立了同名唯一性索引。

现在为表建立了排序顺序相反的两个索引uq_tmp_table_b和xak_tmp_table_b,不知道数据库会怎么工作?

四、题外话

表级约束中可以指定列的排序顺序(col_name ASC | DESC),但不能指定列的NULL约束;

字段级约束中可以指定列的NULL约束,但不能指定列的排序顺序;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9540803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存