《SQL必知必会》万字精华-完结篇

248 阅读5分钟

二十三、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

索引用来排序数据以加快搜索和排序操作的速度。创建索引前记住几点:

  1. 索引改善检索操作的性能,但是降低了数据插入、修改和删除的性能
  2. 索引数据可能要占用大量的存储空间
  3. 索引用于数据过滤和数据排序
  4. 可以在索引中定义多个列
  5. 索引必须唯一命名
CREATE INDEX prod_name_ind
ON Products (prod_name);

触发器trigger

触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。

触发器可以与特定表上INSERT、UPDATE、DELETE操作相关联。触发器的常见用途:

  • 保证数据一致
  • 基于某个表的变动在其他表上执行活动
  • 进行额外的验证并根据需要回退数据
  • 计算计算列的值或者更新时间戳

触发器创建语法四要素:

  1. 监视地点(table)
  2. 监视事件(insert/update/delete)
  3. 触发时间(after/before)
  4. 触发事件(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张表及其字段含义: