友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第32部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
SQL》 create unique view debts as select * from debts_tbl
5 下边的 CREATE 语句是否正确
SQL》 drop * from view debts
6 下边的 CREATE 语句是否正确
SQL》 create index id_index on bills account_id
221
…………………………………………………………Page 222……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
练习
1 检查你所使用的数据库系统 它是否支持视图 允许你在创建视图时使用哪些选项 用
它的语法来写一个简单的创建视图语句 并对其进行如 SELECT 和 DELETE 等常规操
作后再删除视图
2 检查你所使用的数据库系统看它是否支持索引 它有哪些选项 在你的数据库系统中的
一些已经存在的表中试一下这些选项 进一步 确认在你的数据库系统中是否支持
UNIQUE 和 CLUSTER 索引
3 如果可能的话 在一个表中输入几千条记录 用秒表或钟来测定一下你的数据库系统对
特定操作的反映时间 加入索引是否使性能提升了 试一下今天提到的技巧
222
…………………………………………………………Page 223……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
第 11 天 事务处理控制
前十天中我们学习了实际上我们可以对关系数据库系统中的数据所做的每一件事 例
如 我们已经知道了如何使用 SQL 的 SELECT 语句根据用户给定的条件从一个或多个表
中获得数据 我们也有机会体验了数据修改语句如 INSERT DELETE UPDATE 在今天
我们将成为中级 SQL 用户 如果有必要 我们将建立一个数据库及其相关的表 每一个表
中都包括几个不同类型的字段 通过合适的设计方法 我们会成为从数据库到应用程序的
桥梁
目标
如果你是一个临时用户 只需要偶而使用 SQL 从数据库获得数据的话 那么前十天的
的主题已经为你提供了足够的内容 但是 如果你想开发可以在使用数据库系统下运行的
专业应用程序 这在当前在很普遍的 那么你在今后四天中讲到的内容 事务控制 安全
内嵌 SQL 语句 数据库过程 将会对你有很大的帮助 我们先从事务控制开始 到今天的
结束 我们将学会以下内容
l 基本的事务控制
l 如何确认或终止某一项事务
l Sybase 与 Oracle 在事务处理上的不同之处
注 在今天的例子中我们使用 PERSONAL ORACLE 7 和 SYBASE SQL SERVER 对于你
所使用的解释器请查看相应的帮助文档以找出它们的不同之处
事务控制
事务控制或者说事务处理是指关系数据库系统执行数据库事务的能力 事务是指在逻
辑上必须完成的一命令序列的单位 单元工作期是指事务的开始和结束时期 如果在事务
中产生的错误 那么整个过程可以根据需要被终止 如果每一件事都是正确的 那么结果
将会被保存到数据库中
日后你也许会运行其于网络的多用户应用程序 客户/服务环境就是为它而设计的 传
223
…………………………………………………………Page 224……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
统上的服务器 例如数据库服务器 支持多个与它连接的工作站 与其它技术一样 新特
性提高了数据库的复杂程度 下边的几段描述了一个银行所使用的应用程序
银行应用程序
假定你受雇于联邦银行并负责为他们设计一个支票管理系统 你已经设计了一个非常
完美的数据库 并且经常测试检验证明是正确无误的 你在应用程序中调用它以后 你从
账号中支取了 20 元并进行验证 数据库中确实已经少了 20 元 你又从帐号中存入了 50。25
元并进行验证 结果也与所期望的相同 于是你骄傲在告诉你的老板系统可以运行了 几
台计算机接入了程序并开始工作
几分钟以后 你注意到了一个你没有预见的问题 一个出纳员向帐号中存入了一张支
票而另一个出纳则从相同的帐号中提出了一部分钱 在分钟之内 由于多用户的同时操作
就导致的帐目无法平衡 很不幸 由于他们之间互相进行更新和写入操作 你的应用程序
很快就因为过负荷而断线 我们假定出现这个问题的数据库名字叫 CHECKING 它有两个
表 其内容如下所示
表 11。1
Name Address City State Zip Customer_ID
Bill Turner 725 N。 Deal Parkway Washington DC 20085 1
John Keith 1220 Via De Luna Dr。 Jacksonville FL 33581 2
Mary Rosenberg 482 Wannamaker Avenue Williamsburg VA 23478 3
David Blanken 405 N。 Davis Highway Greenville SC 29652 4
Rebecca Little 7753 Woods Lane Houston TX 38764 5
表 11。2
Average_Bal Curr_Bal Account_ID
1298。53 854。22 1
5427。22 6015。96 2
211。25 190。01 3
73。79 25。87 4
1285。90 1473。75 5
1234。56 1543。67 6
345。25 348。03 7
假定你的应用程序为 BILL Turner 运行了 SELECT 查询并得到如下结果
OUTPUT
224
…………………………………………………………Page 225……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME Bill Turner
ADDRESS 725 N。 Deal Parkway
CITY Washington
STATE DC
ZIP 20085
CUSTOMER_ID 1
当返回数据的时候 另外一个用户连接到了数据库并更新了 BILL Turner 的住址信息
INPUT
SQL》 UPDATE CUSTOMERS SET Address =〃11741 Kingstowne Road〃
WHERE Name = 〃Bill Turner〃
你现在看到了 如果在你执行 SELECT 语句当中出现的更新操作的话那么你所得到的
结果将是不正确的 如果你的应用程序可以生成一个信件给 Bill Turner 那么由于地址是
错误的 如果信已经发送了 那你是不能对地址进行修改的 但是如果你使用了事务处理
机制 那么你就可以对检测到错误的数据进行修改 你所进行的所有操作也都可以撤消
开始事务处理
事务处理在执行上是非常简单的 你需要检查你所执行的语法是 Oracle RDBMS SQL
语法还是 Sybase SQL Server SQL 语法
所有支持事务处理的系统都必须以一种准确的语法来告诉系统一项事务是如何开始的
不要忘记事务处理只是工作的逻辑分组 它有自己的开始和结束 在使用 PERSONAL
ORACLE7 时 它的语法形式如下
SYNTAX
SET TRANSACTION {READ ONLY | USE ROLLBACK SEGMENT segment}
SQL 标准要求每一种数据库的 SQL 解释器都必须运支持语句级的读一致 这也就是
说 当某一条语句运行的时候数据必需保持不变 但是 在许多情况下在一个工作过程中
必须要求数据保持有效 而不仅仅是对单个语句 ORACLE 允许用户用 SET TRANSACTION
来指定事务的开始 如果你想检查 BILL TUNER 的信息并且要保证数据在这之中是不能改
变的 那么你可以使用如下语句
INPUT
225
…………………………………………………………Page 226……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SET TRANSACTION READ ONLY
SQL》 SELECT * FROM CUSTOMERS
WHERE NAME = 'Bill Turner';
SQL》 MIT
我们将在今天的晚些时候来讨论 MIT 语句 这里的 SET TRANSACTION READ
ONLY 允许你锁定一个记录集直到事务结束 你可以在下列语句中使用 READ ONLY 选项
SELECT
LOCK TABLE
SET ROLE
ALTER SESSION
ALTER SYSTEM
选项 USE ROLLBACK SEGMENT 告诉 ORACLE 数据库提供数据回溯的存储空间段
这一选项是 ORACLE 对标准的 SQL 的扩展 如果需要维护你的数据库请参见 ORACLE 的
帮助文档以获得更多的帮助信息
SQL Server's Transact…SQL 语言用下边的方法来实现了开始事务处理的命令
SYNTAX
begin {transaction | tran} 'transaction_name'
它的实现方法与 ORACLE 的有一些不同 SYBASE 不允许你指定 READ ONLY 选
项 但是 SYBASE 允许你给出事务处理的名字 从最早的事务到最近发生的事务处理都
可以一次退回
INPUT
1》 begin transaction new_account
2》 insert CUSTOMERS values (〃Izetta Parsons〃; 〃1285 Pineapple Highway〃; 〃Greenville〃; 〃AL〃
32854; 6)
3》 if exists(select * from CUSTOMERS where Name = 〃Izetta Parsons〃)
4》 begin
5》 begin transaction
6》 insert BALANCES values(1250。76; 1431。26; 8)
7》 end
8》 else
226
…………………………………………………………Page 227……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
9》 rollback transaction
10》 if exists(select * from BALANCES where Account_ID = 8)
11》 begin
12》 begin transaction
13》 insert ACCOUNTS values(8; 6)
14》 end
15》 else
16》 rollback transaction
17》 if exists (select * from ACCOUNTS where Account_ID = 8 and Customer_ID = 6)
18》 mit transaction
19》 else
20》 rollback transaction
21》 go
现在 请不要担心 ROLLBACK TRANSACTION 和 MIT TRANSACTION 语句
重要的问题是这是一个内嵌的事务处理 或者说是事务处理之中还有事务处理
注意 最开始的事务处理在第 1 行 之后是插入语句 你检查了插入确实已经执行了
以后 第二个事务处理在第 5 行开始 这种在事务之中的事务在术语上称为内嵌事务
有一些数据库支持 AUTOMIT 选项 它可以在 SET 命令中使用 如下例
SET AUTOMIT 'ON | OFF'
默认情况上 SET AUTOMIT ON 命令在启动时是自动运行的 它告诉 SQL 自动确
认你所运行的所有的语句 如果你不想让这个命令自动运行 那么请将它的参数设为 NO
SET AUTOMIT OFF
注 请检查你的数据库文档确认在你的数据库系统中一项事务处理是如何开始的
结束事务处理
在 ORACLE 语法中结束事务处理语句的语法如下
SYNTAX
MIT 'WORK'
' MENT 'text'
227
…………………………………………………………Page 228……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
| FORCE 'text' '; integer' ' ;
它的命令语法与 Sybase 的语法是相同的
语法
MIT (TRANSACTION | TRAN | WORK) (TRANSACTION_NAME)
MIT 命令将保存在一项事务中所进行的所有的改变 在开始一项事务处理之前要
先运行 MIT 命令以确保在之前没有事务未被确认
在下边的例子中 如果 MIT 没有收到任何系统错误的情况下它将会执行确认
INPUT
SQL》 MIT;
SQL》 SET TRANSACTION READ ONLY;
SQL》 SELECT * FROM CUSTOMERS
WHERE NAME = 'Bill Turner';
………Do Other Operations……
SQL》 MIT;
在 ORACLE 中 MIT 语句的使用方法如下
INPUT
SQL》 SET TRANSACTION;
SQL》 INSERT INTO CUSTOMERS VALUES
(〃John MacDowell〃; 〃2000 Lake Lunge Road〃; 〃Chicago〃; 〃IL〃; 42854; 7);
SQL》 MIT;
SQL》 SELECT * FROM CUSTOMERS;
CUSTOMER 表的内容如下
Name Address City State Zip Customer_ID
Bill Turner 725 N。 Deal Parkway Washington DC 20085 1
John Keith 1220 Via De Luna Dr。 Jacksonville FL 33581 2
Mary Rosenberg 482 Wannamaker Avenue Williamsburg VA 23478 3
David Blanken 405 N。 Davis Highway Greenville SC 29652 4
Rebecca Little 7753 Woods Lane Houston TX 38764 5
Izetta Parsons 1285 Pineapple Highway Greenville AL 32854 6
John MacDowell 2000 Lake Lunge Road Chicago IL 42854 7
而 Sybase SQL 使用 MIT 的语法方式如下
228
…………………………………………………………Page 229……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
INPUT
1》begin transaction
2》insert into CUSTOMERS values
(〃John MacDowell〃; 〃2000 Lake Lunge Road〃; 〃Chicago〃; 〃IL〃; 42854; 7)
3》mit transaction
4》go
1》select * from CUSTOMERS
2》go
Name Address City State Zip Customer_ID
Bill Turner 725 N。 Deal Parkway Washington DC 20085 1
John Keith 1220 Via De Luna Dr。 Jacksonville FL 33581 2
Mary Rosenberg 482 Wannamaker Avenue Williamsburg VA 23478 3
David Blanken 405 N。 Davis Highway Greenville SC 29652 4
Rebecca Little 7753 Woods Lane Houston TX 38764 5
Izetta Parsons 1285 Pineapple Highway Greenville AL 32854 6
John MacDowell 2000 Lake Lunge Road Chicago IL 42854 7
上边的语句完成了与 ORACLE7 相同的功能 但是 在使用 MIT 确认事务处理
之前 你应该确保在该事务中的工作是正确无误的
注 MIT WORD 命令与 MIT 命令的作用是相同的 或 Sybase 中的 MIT
TRANSACTION 它与 ANSI SQL 的语法一样的简单
切记 MIT 语句一定要与之前的 SET TRANSCATION 或 BEGIN TRANSCATION
语句一致 注意 在下边的语句中你将会收到错误信息
Oracle SQL
INPUT
SQL》 INSERT INTO BALANCES values (18765。42; 19073。06; 8);
SQL》 MIT WORK;
Sybase SQL
INPUT
1》 insert into BALANCES values (18765。42; 19073。06; 8)
2》 mit work
229
…………………………………………………………Page 230……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
取消事务处理
在一个事务处理的过程中 常常会运行一些错误检查以确认在过程中是否语句是运行
成功 你可以使用 ROLLBACK 语句来撤消事务中所做的每一项工作 即便工作是成功的
你也可以撤消 但是 这必须是在 MIT 之前 ROLLBACK 语句必须在一个事务之中
运行 它可以一直撤消到事务的开始 也就是说 数据库会一直返回到事务处理刚开始的
状态 在 ORACLE 7 中它的语法形式如下
SYNTAX
ROLLBACK 'WORK'
' TO 'SAVEPOINT' savepoint
| FORCE 'text' '
如你所见 该命令可以设置事务的 SAVEPOINT 我们将在今天的晚些时候来讨论这
项技术
Sybase Transact…SQL's 的ROLLBACK 语句与 MIT 语句非常相似
SYNTAX
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!