一、外键:
从一个表的一个列到另一个不同的表中的一个列的直接引用。
设置一个外键时,要求指定两个列,配置了外键列的表为子表,另一个表中被引用的列则位于父表中。不允许先删除父表,子表必须依赖父表。
设置外键,可以为父表中涉及到更新和操作的行设置一些具体的行为。比如外键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,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据。
文本索引