二十三、SQL高级特性
在最后的一章中简单的介绍了SQL的3个高级特性:
- 约束constraint
- 索引index
- 触发器trigger
约束
约束是管理如何插入或者处理数据库数据的规则。DBMS通过在数据库表上施加约束来实施引用完整性。
1、主键
主键是一种特殊的约束,用来保证一列(或者一组列)中的值是唯一的。主键必须满足的4个条件:
- 任意两行的主键值不相同
- 每行都具有一个主键值,即列中不允许NULL值
- 包含主键的列从不修改或者更新
- 主键值不能重复用
-- 方式1
CREATE TABLE Vendors(
vend_id char(10) NOT NULL primary key, -- 添加主键
vend_name char(50) NOT NULL,
vend_address char(50) NULL,
vend_city char(50) NULL,
vend_state char(5) NULL,
vend_zip char(10) NULL,
vend_country char(50) NULL
);
-- 方式2
ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY (vend_id);
2、外键
外键值表中的一列,其值必须列在另一表的主键中。外键是保证引用完整性的重要部分。
通过订单信息表Orders表中的顾客ID和顾客信息表Customers的顾客ID进行关联。
CREATE TABLE Orders
(
order_num INTEGER NOT NULL PRIMARY KEY, -- 主键:订单号唯一
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT REFERENCES -- 外键:顾客id不唯一,一个顾客可能有多个订单
)
3、唯一约束
唯一约束用来保证一列中的数据是唯一的,可以通过关键词UNIQUE来定义。它和主键的区别在于:
- 表中可以包含多个唯一约束,但是只能有一个主键
- 唯一约束列可以包含NULL值
- 唯一约束列可以修改或者更新
- 唯一约束列的值可以重复使用
- 与主键不同,唯一约束不能用来定义外键
4、检查约束
检查约束用来保证一列(或者一组列)中的数据满足一组指定的条件,常见的用途有:
- 检查最大值或者最小值
- 指定数据的范围
- 只允许特定的值,例如性别字段中只允许M或者F
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity>0), -- 设置检查约束,保证大于0
item_price MONEY NOT NULL
)
索引index
索引用来排序数据以加快搜索和排序操作的速度。创建索引前记住几点:
- 索引改善检索操作的性能,但是降低了数据插入、修改和删除的性能
- 索引数据可能要占用大量的存储空间
- 索引用于数据过滤和数据排序
- 可以在索引中定义多个列
- 索引必须唯一命名
CREATE INDEX prod_name_ind
ON Products (prod_name);
触发器trigger
触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
触发器可以与特定表上INSERT、UPDATE、DELETE操作相关联。触发器的常见用途:
- 保证数据一致
- 基于某个表的变动在其他表上执行活动
- 进行额外的验证并根据需要回退数据
- 计算计算列的值或者更新时间戳
触发器创建语法四要素:
- 监视地点(table)
- 监视事件(insert/update/delete)
- 触发时间(after/before)
- 触发事件(insert/update/delete)
笔记:触发器只能创建在永久表上,而不能对临时表创建触发器
触发器创建的基本语法如下
CREATE TRIGGER trigger_name
AFTER/BEFORE INSERT/UPDATE/DELETER ON table_name
FOR each row -- 固定语句
begin
sql语句;
end;
二十四、总结
《SQL必知必会》一本非常经典的数据库书籍,也可以说是自己入门数据库的书。算上本次万字精华整理,应该是第三次系统的阅读本书,本书主要有几个特点:
- 知识全面:书中囊括了很多的数据库知识,从最基础的创建库表到联结查询,再到数据库的视图、触发器等,有基础也有提升
- 案例丰富:本书的讲解主要是通过5个不同表来完成,结合各种案例来说明SQL的使用细节
- 对比性强:不同的DBMS系统的语法是有一定出入的,本书在讲解的过程中针对不同DBMS,给出不同的写法,主要还是MySQL
附录
本书中涉及到的5张表及其字段含义: