SQL必知必会读书笔记(四)【数据库系统概论课本上没有的内容】

存储过程这一节根本没看懂(未完......)
(SQL Server 中所有局部变量名都以@起头)

使用事务处理(transaction processing),通过确保成批的 SQL 操作要么完全执行要么完全不执行来维护数据库的完整性

事务处理是一种机制,用来管理必须成批执行的 SQL 操作,保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它要么完全执行,要么完全不执行(除非明确指示)。如果没有错误发生,整组语句提交给(写到)数据库表;如果发生错误,则进行回退(撤销),将数据库恢复到某个已知且安全的状态

在使用事务处理时,有几个反复出现的关键词。下面是关于事务处理需要知道的几个术语:
 事务(transaction)指一组 SQL 语句;
 回退(rollback)指撤销指定 SQL 语句的过程;
 提交(commit)指将未存储的 SQL 语句结果写入数据库表;
 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),可以对它发布回退(与回退整个事务处理不同)。

输入
BEGIN TRANSACTION 
... 
COMMIT TRANSACTION 
分析
在这个例子中,BEGIN TRANSACTION 和 COMMIT TRANSACTION 语句之间的 SQL 必须完全执行或者完全不执行。

输入▼
DELETE FROM Orders; 
ROLLBACK; 
分析▼
在此例子中,执行 DELETE 操作,然后用 ROLLBACK 语句撤销。虽然这是最有用的例子,但它的确能够说明,在事务处理块中,DELETE 操作(与INSERT 和 UPDATE 操作一样)并不是最终的结果。

输入▼
BEGIN TRANSACTION 
INSERT INTO Customers(cust_id, cust_name) 
VALUES('1000000010', 'Toys Emporium'); 
SAVE TRANSACTION StartOrder; 
INSERT INTO Orders(order_num, order_date, cust_id) 
VALUES(20100,'2001/12/1','1000000010');
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; 
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, 
➥item_price) 
VALUES(20100, 1, 'BR01', 100, 5.49); 
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; 
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, 
➥item_price) 
VALUES(20100, 2, 'BR03', 100, 10.99); 
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; 
COMMIT TRANSACTION 
分析▼
这里的事务处理块中包含了 4 条 INSERT 语句。在第一条 INSERT 语句之后定义了一个保留点,因此,如果后面的任何一个 INSERT 操作失败,事务处理能够回退到这里。在 SQL Server 中,可检查一个名为@@ERROR的变量,看操作是否成功。(其他 DBMS 使用不同的函数或变量返回此信息。)如果@@ERROR 返回一个非 0 的值,表示有错误发生,事务处理回退到保留点。如果整个事务处理成功,发布 COMMIT 以保留数据。

游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。

不同的 DBMS 支持不同的游标选项和特性。常见的一些选项和特性如下。
 能够标记游标为只读,使数据能读取,但不能更新和删除。
 能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)。
 能标记某些列为可编辑的,某些列为不可编辑的。
 规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。
 指示 DBMS 对检索出的数据(而不是指出表中活动数据)进行复制,使数据在游标打开和访问期间不变化。

使用游标涉及几个明确的步骤
 在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的 SELECT 语句和游标选项。
 一旦声明,就必须打开游标以供使用。这个过程用前面定义的 SELECT语句把数据实际检索出来。
 对于填有数据的游标,根据需要取出(检索)各行。
 在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的 DBMS)。

输入▼
DECLARE CustCursor CURSOR 
FOR 
SELECT * FROM Customers 
WHERE cust_email IS NULL

输入▼
OPEN CURSOR CustCursor 
分析▼
在处理 OPEN CURSOR 语句时,执行查询,存储检索出的数据以供浏览和滚动。

21.2 使用游标 | 187
输入▼
DECLARE TYPE CustCursor IS REF CURSOR 
  RETURN Customers%ROWTYPE; 
DECLARE CustRecord Customers%ROWTYPE 
BEGIN 
  OPEN CustCursor; 
  FETCH CustCursor INTO CustRecord; 
  CLOSE CustCursor; 
END; 
分析▼
在这个例子中,FETCH 用来检索当前行(自动从第一行开始),放到声明的变量 CustRecord 中。对于检索出来的数据不做任何处理

输入▼
CLOSE CustCursor 
DEALLOCATE CURSOR CustCursor 
分析▼
CLOSE 语句用来关闭游标。一旦游标关闭,如果不再次打开,将不能使用。第二次使用它时不需要再声明,只需用 OPEN 打开它即可。

高级 SQL 特性

唯一约束用来保证一列(或一组列)中的数据是唯一的。它们类似于主键,但存在以下重要区别。
 表可包含多个唯一约束,但每个表只允许一个主键。
 唯一约束列可包含 NULL 值
 唯一约束列可修改或更新。
 唯一约束列的值可重复使用。
 与主键不一样,唯一约束不能用来定义外键。

检查约束用来保证一列(或一组列)中的数据满足一组指定的条件。检查约束的常见用途有以下几点。
 检查最小或最大值。例如,防止 0 个物品的订单(即使 0 是合法的数)。
 指定范围。例如,保证发货日期大于等于今天的日期,但不超过今天起一年后的日期。
 只允许特定的值。例如,在性别字段中只允许 M 或 F。

索引用来排序数据以加快搜索和排序操作的速度。

在开始创建索引前,应该记住以下内容。
 索引改善检索操作的性能,但降低了数据插入、修改和删除的性能。在执行这些操作时,DBMS 必须动态地更新索引。
 索引数据可能要占用大量的存储空间
 并非所有数据都适合做索引。取值不多的数据(如州)不如具有更多可能值的数据(如姓或名),能通过索引得到那么多的好处。
 索引用于数据过滤和数据排序。如果你经常以某种特定的顺序排序数据,则该数据可能适合做索引。
 可以在索引中定义多个列(例如,州加上城市)。这样的索引仅在以州加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。

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

下面是触发器的一些常见用途
 保证数据一致。例如,在 INSERT 或 UPDATE 操作中将所有州名转为大写。
 基于某个表的变动在其他表上执行活动。例如,每当更新或删除一行时将审计跟踪记录写入某个日志表。
 进行额外的验证并根据需要回退数据。例如,保证某个顾客的可用资金不超限定,如果已经超出,则阻塞插入。
 计算计算列的值或更新时间戳

猜你喜欢

转载自blog.csdn.net/red_red_red/article/details/89439434
今日推荐