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

来源:互联网 发布:php短信轰炸机源码 编辑:程序博客网 时间:2024/04/30 20:27

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 VendorsADD 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 CustomersADD CONSTRAINTFOREIGN 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_indON 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_stateAFTER INSERT OR UPDATEFOR EACH ROWBEGINUPDATE CustomersSET cust_state = Upper(cust_state)WHERE Customers.cust_id = :OLD.cust_idEND;

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

22.4数据库安全

大多数的DBMS都给管理员提供了管理机制,可利用管理机制授予或限制对数据的访问。
任何安全系统的基础都是用户授权和身份确认。这是一种处理,通过这种处理对用户进行确认,以保证他是有权用户,允许他执行他试图执行的操作。有的DBMS为此目的结合使用了操作系统的安全措施,而有的维护自己的用户及密码列表,还有一些结合使用外部目录服务服务器。
需要保护的操作:
(1)对数据库管理功能的访问。
(2)对特定数据库或表的访问。
(3)访问的类型。
(4)仅通过视图或存储过程对表进行访问。
(5)创建多层次的安全措施,从而允许多种基于登录的访问和控制。
(6)限制管理用户账号的能力。
安全性通过SQL的GRANT和REVOKE语句来管理,不过,大多数DBMS提供了交互式的管理使用程序,这些使用程序在内部使用GRANT和REVOKE语句。

1 0
原创粉丝点击