SQL必知必会 笔记 第二十二章 了解高级SQL特性

22.1约束

为正确地进行关系数据库设计,需要一种方法来保证只在表中插入合法的数据。例如,如果Orders表存储订单信息,OrderItems表存储订单详细内容,应该保证Orderitems中引用的任何订单ID存在于Orders中。类似地,在Orders表中引用的任意用户必须存在于Customers表中。

虽然可以在插入新行时进行检查,但最好不要这样做,原因如下:

(1)如果在客户机层面上实施数据库完整性规则,则每个客户机都被迫要实施这些规则,但很可能会有一些客户机不实施这些规则。

(2)在执行UPDATE和DELETE操作时,也必须实施这些规则。

(3)执行客户机端检查是非常耗时的,而DBMS执行这些检查会相对高效。

约束(constraint)管理如何插入或处理数据库数据的规则。

DBMS通过在数据库表上施加约束来实施引用完整性。大多数约束是在表定义中定义的。

22.1.1主键

主键是一种特殊的约束,它用来保证一个列(或一组列)中的值是唯一的,并且永不改动。换句话说,表中的一个列(或多个列)的值唯一标识表中的行。

表中任意列只要满足以下条件,都可以用于主键:

(1)任意两行的主键值都不相同。

(2)每行都具有一个主键值(即列中不允许NULL值)。

(3)包含主键值的列不修改或更新。

(4)主键值不能重用。如果从表中删除某一行,其主键值不分配给新行。

定义主键的一种方法是创建它,如下所示:

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
};

修改为主键

ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY(vend_id);

22.1.2外键

外键是表中的一个列,其值必须在另一个表的主键中列出。外键是保证引用完整性的一个极重要的成分。

例如:Orders表对每个录入到系统的订单包含一行。客户信息存储在Customers表中。Orders表中的订单通过客户ID与Customers表中特定行相关联。客户ID为Customers表的主键;每个客户都有唯一的ID。订单号为Orders表的主键;每个订单都有唯一的订单号。

定义外键的的一种方法

CREATE TABLE Orders
{
     order_num      INTEGER        NOT NULL PRIMARY KEY,
     order_date     DATETIME       NOT NULL,
     cust_id        CHAR(10)       NOT NULL REFERENCES Customers(cust_id)
};

也可以使用ALTER TABLE语句中也难怪CONSTRAINT语法来完成

ALTER TABLE Customers
ADD CONSTRAINT
FOREIGN KEY (cust_id) REFERENCES Customers (cust_id);

外键可帮助防止意外的删除:除帮助保证引用完整性外,外键还有另一个重要的作用。在定义外键后,DBMS不允许删除在另一个表中具有关联行的行。

22.1.3唯一约束

唯一约束用来保证一个列中的数据唯一。它们类似于主键,但存在几个重要的区别:

(1)表可包含多个唯一约束,但每个表只允许一个主键。

(2)唯一约束列可包含NULL值。

(3)唯一约束列可修改或更新。

(4)唯一约束列的值可重复使用。

(5)与主键不一样,唯一约束不能用来定义外键。

唯一约束的语法类似于其他约束的语法。唯一约束既可以用UNIQUE关键字在表定义中定义,也可以用单独的CONSTRAINT定义。

22.1.4检查约束

检查约束用来保证一个列中的数据满足一组指定的条件。检查约束的插件用途为:

(1)检查最小或最大值。

(2)指定范围。

(3)只允许特定的值。

定义时给出约束:

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),
     item_price    MONEY       NOT NULL
};

为检查名为gender的列只包含M或F,可编写如下的ALTET TABLE语句

ADD CONSTRAINT CHECK (gender LIKE ‘[MF]‘);

22.2索引

索引用来排序数据以加快搜索和排序操作的速度。理解索引的最好办法是想象一本书后的索引。

可以在一个或多个列上定义索引,使DBMS保存其内容的一个排过序的列表。在定义了索引后,DBMS用与使用书的索引类似的方法是用它。DBMS搜索排过序的索引,找出匹配的位置,然后检索这些行。

在开始创建索引前,应该记住以上内容:

(1)索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。

(2)索引数据可能要占用大量的存储空间。

(3)并非所有数据都适合于索引。唯一性不好的数据从索引得到的好处不比具有更多可能值的数据从索引得到的好处多。

(4)索引用于数据过滤和数据排序。如果你经常以某种特定的顺序排序数据,则该数据可能是索引的备选。

(5)可以在索引中定义多个列。这样的索引仅在以州加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。

索引用CREATE INDEX语句创建。下面的语句在Products表的产品名列上创建一个简单的索引:

CREATE INDEX prod_name_ind
ON PRODUCTS(prod_name);

索引必须唯一命名。这里的索引名在关键字CREATE INDEX之后定义。ON用来指定被索引的表,而索引中包含的列在表名后的圆括号中给出。

检查索引:索引的效率随表数据的增加或改变而变化。许多数据库管理员发现,过去创建的某个理想的索引在几个月的数据处理后可能不理想了。最好顶起检查索引,并根据需要对索引进行调整。

22.3触发器

触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、UPDATE和DELETE操作相关联。

与存储过程不一样,触发器与单个的表相关联。与Orders表上的INSERT操作相关联的触发器只在Orders表中插入行时执行。类似地,Customers表上的INSERT和UPDATE操作的触发器只在表上出现这些操作时执行。

触发器内的代码具有以下数据的访问权:

(1)INSERT操所中的所有新数据;

(2)UPDATE操作中的所有新数据和旧数据;

(3)DELETE操作中删除的数据。

触发器的一些常见用途:

(1)保证数据一致。

(2)基于某个表的变动在其他表上执行活动。

(3)进行额外的验证并根据需要回退数据。

(4)计算计算列的值或更新时间戳。

创建一个触发器,它对所有INSERT和UPDATE操作,转换Customers表中的cust_state列为大写。

CREATE TRIGGER customer_state
AFTER INSERT OR UPDATE
FOR EACH ROW
BEGIN
UPDATE Customers
SET cust_state = Upper(cust_state)
WHERE Customers.cust_id = :OLD.cust_id
END;

约束比触发器更快:一般来说,约束的处理比触发器快,因此在可能的时候,应该尽量使用约束。

22.4数据库安全

大多数的DBMS都给管理员提供了管理机制,可利用管理机制授予或限制对数据的访问。

任何安全系统的基础都是用户授权和身份确认。这是一种处理,通过这种处理对用户进行确认,以保证他是有权用户,允许他执行他试图执行的操作。有的DBMS为此目的结合使用了操作系统的安全措施,而有的维护自己的用户及密码列表,还有一些结合使用外部目录服务服务器。

需要保护的操作:

(1)对数据库管理功能的访问。

(2)对特定数据库或表的访问。

(3)访问的类型。

(4)仅通过视图或存储过程对表进行访问。

(5)创建多层次的安全措施,从而允许多种基于登录的访问和控制。

(6)限制管理用户账号的能力。

安全性通过SQL的GRANT和REVOKE语句来管理,不过,大多数DBMS提供了交互式的管理使用程序,这些使用程序在内部使用GRANT和REVOKE语句。

时间: 2024-08-08 09:34:03

SQL必知必会 笔记 第二十二章 了解高级SQL特性的相关文章

20190925 On Java8 第二十二章 枚举

第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法,它根据给定的名字返回相应的 enum 实例,如果不存在给定名字的实例,将会抛出异常. 将静态类型导入用于 enum 使用 static import 能够将 enum 实例的标识符带入当前的命名空间,所以无需再用 enum 类型来修饰 enum 实例. 方法添加 除了不能继承自一个 enum 之外

第二十二章 TCP/IP层的实现

                      第二十二章    TCP/IP层的实现        我比较喜欢先难后易,如果把GPU显示管理.和网络管理拿下后:我会从头整理.改写一遍APO操作系统.这样,就会形成APO操作系统的锥形.也获得了全局观.内核CPU线路.和用户CPU线路,你可以将它们看成是独立的2个32位CPU核:内核CPU主要任务是实时处理.硬件中断,256个实时线程包含了一些中断程序的后半部.用户CPU主要是动态优先级进程.线程调度,各种应用程序的运行:2个核之间是通过消息交互.句

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

“全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第二十二章:控制流程语句中的决策语句if-else 下一章 "全栈2019"Java第二十三章:流程控制语句中决策语句switch上篇 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

SQL必知必会 笔记 第十二章 联结表

12.1联结 SQL最强大的功能之一即是在数据查询的执行中联结(join)表. 12.1.1关系表 相同数据出现多次绝不是一件好事,此因素是关系数据库设计的基础.关系表的设计就是要保证把信息分解成多个表,一类数据一个表.各表通过某些常用的值(即关系设计中的关系(relational))互相关联. 可伸缩性(scale):能够适应不断增加的工作量而不失败.设计良好的数据库或应用程序称之为可伸缩性好(scale well). 12.1.2为什么要使用联结 如果数据存储在多个表中,怎样用单条SELEC