SQL 之 外键、索引

一、外键:

从一个表的一个列到另一个不同的表中的一个列的直接引用。

设置一个外键时,要求指定两个列,配置了外键列的表为子表,另一个表中被引用的列则位于父表中。不允许先删除父表,子表必须依赖父表。

设置外键,可以为父表中涉及到更新和操作的行设置一些具体的行为。比如外键CustomerID

(1)No Action:默认行为,如果把列CustomerID的更新设置为No Action,意味着任何想要更新父表中的CustomerID列的话都要做检查。如果试图更新CustomerID而可能导致子表中任意行指向一个不存在的值,No Action防止这种情况发生。对于删除也同样有效。确保在两个表都使用CustomerID时,子表的行正确指向父表的中已有的行。


(2)cascade:当更新父表的值,如果影响到子表的行,则自动更新子表中的所有的行,以反映父表中的新值。如果删除影响到子表,就自动删除子表中受影响的行。


(3)set null:当更新或删除父表中的一个值,会影响到子表的行,就自动把子表中受影响的行的外键更新为包含一个NULL值。

示例:创建表

CREATE TABLE MyTable
(ColumnOne INT IDENTITY (1,1) PRIMARY KEY NOT NULL,
ColumnTwo INT NOT NULL
REFERENCES RelatedTable (FirstColum),
ColumnThree VARCHAR(25) NULL,
ColumnFour FLOAT NULL DEFAULT(10) )

删除某列

ALTER TABLE MyTable

DROP COLUMN ColumnThree


二、创建索引

CREATE INDEX Index2

ON MyTable (ColumnFour)

索引是一种特殊的查询表,可以被数据库搜索引擎用来加速数据的检索(查询优化器选择索引以优化查询)。简单说来,索引就是指向表中数据的指针。

索引能够提高 SELECT 查询和 WHERE 子句的速度,但是却降低了包含 UPDATE 语句或 INSERT 语句的数据输入过程的速度。索引的创建与删除不会对表中的数据产生影响。创建索引需要使用 CREATE INDEX 语句,该语句允许对索引命名,指定要创建索引的表以及对哪些列进行索引,还可以指定索引按照升序或者降序排列。

创建索引基本语法

CREATE INDEX index_name 

ON table_name


或者使用ALTER关键字

ALTER TABLE department

ADD INDEX dept_name_idx(name);

这句为department.name创建了索引(准确来说,这是一个B树)。


单列索引:

CREATE INDEX index_name
ON table_name (column_name)


唯一索引

CREATE UNIQUE INDEX index_name
on table_name (column_name)


聚簇索引(也就是两列及以上)

CREATE INDEX index_name
on table_name (column1, column2)


索引类型:

B树索引

平衡树索引/B树索引。三种数据库都默认B树索引。除非我们显式指定要求其他类型。B树索引以树结构组织,有一个或多个分支节点,分支节点又指向单级的叶节点。分支节点用于遍历树,叶节点则保存真正的值和位置信息。




1)      叶子节点(Leaf node):包含条目直接指向表里的数据行。
2)      分支节点(Branch node):包含的条目指向索引里其他的分支节点或者是叶子节点。
3)      根节点(Root node):一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点。

查找:根节点->根据目标值和节点大小判断找到合适的指针,顺着指针前进到下一级分支节点->在分支节点内一次查看直到找到目标叶节点。

插入、更新、删除:服务器会尽力保持树的平衡,不会出现根节点的某一侧拥有比另一侧多得多的分支节点和叶节点,服务器通过增加或删除分支节点重新将值分配得更加均匀。通过保持树的均匀,不需要遍历多层分支节点,服务器能够很快速地到达叶节点查找到需要的值。


位图索引

B树索引擅长处理包含很多不同值的列,但是在处理允许少量不同值的列会变得很难使用。

如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些基数值比较小的列建索引,就需要建立位图索引。

Oracle引入了位图索引。它为存储在某列的每个值生成一个位图。当使用count(XX),可以直接访问索引就快速得出统计数据;当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据。


文本索引


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值