SQL语言的基础操作--(4)

来源:互联网 发布:js pdf在线阅读 编辑:程序博客网 时间:2024/05/21 09:34

事务、索引和游标

事务

-- 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作
-- 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行
-- 事务是一个不可分割的工作逻辑单元

-- 事务必须具备以下四个属性,简称ACID 属性:
-- 原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
-- 一致性(Consistency):当事务完成时,数据必须处于一致状态
-- 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖 -- 于或影响其他事务
-- 永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性
-- =========================================================================================================================
-- T-SQL使用下列语句来管理事务:
-- 开始事务:BEGIN TRANSACTION
-- 提交事务:COMMIT TRANSACTION
-- 回滚(撤销)事务:ROLLBACK TRANSACTION
-- 一旦事务提交或回滚,则事务结束。
-- ==============================================
--判断某条语句执行是否出错:
--使用全局变量@@ERROR;
-- @@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计
-- 如:
     SET @errorSum=@errorSum+@@error
-- =========================================================================================================================
-- 事务的分类:
-- 显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型
-- 隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。     -- 当该事务完成时,再下一个T-SQL 语句又将启动一个新事务
-- 自动提交事务:这是SQL Server 的默认模式,它将每条单独的T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果 -- 错误,则自动回滚
-- =================================================================================================================
-- 下面举一个银行转账的实例。银行余额不能小于1元,否则视为销户,假定从张三的账户直接转1000元到李四的账户。
-- 如果不采用事务,那么将会导致张三中的余额不变,而李四中的多出1000元。具体代码如下:
-- 建表
create table bank
(
   currentMoney  money,
   customerName varchar(50) primary key
)
-- 添加约束
alter table bank
add constraint CK_currentMoney   
check(currentMoney>=1)

insert into bank values(1000.00, 'zhangsan')
insert into bank values(1.00, 'lisi')
-- 开始事务
begin transaction
declare @errorSum int
set @errorSum=0
update bank set currentMoney = currentMoney-1000
where customerName ='zhangsan'
set @errorSum = @errorSum+ @@error
update bank set currentMoney = currentMoney+1000
where customerName ='lisi'
set @errorSum = @errorSum+ @@error
-- 检查错误信息,只有上述两个操作都成功,才提交事务
if @errorSum<>0
   begin
   print '交易失败,回滚事务'
   rollback transaction
   end
else
   begin
   print '交易成功,提交事务'
   commit transaction
   end
print '转账事务后的余额'
select * from bank
go
-- ==================================================================================================================

索引

--SQL Server中的数据也是按页(4KB )存放
--索引:是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据。
--索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页。
--索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。

--索引的分类:
--唯一索引:唯一索引不允许两行具有相同的索引值
--主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
--聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
--非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于个

--优点:
--加快访问速度,加强行的唯一性
--缺点:
--带索引的表在数据库中需要更多的存储空间
--操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新

--=================================================================================================
-- create [UNIQUE] [CLUSTER] index <索引名> ON <表名> (<列名>[<次序>][,<列名>[<次序>]]...);
-- 其中,<表名>指定要建索引的基本表的名字。
-- 索引可以建在该表的一列或多列上,各列名之间用逗号分隔。
-- 每个<列名>后面还可以用<次序>指定索引值的排列次序,包括ASC(升序)和DESC(降序)两种,缺省值为ASC。
-- =========================== =====================================================================

-- 例:
-- 为学生-课程数据库中的Student、Couse、SC三个表建立索引。
-- 其中Student表按学号升序建唯一索引,Couse表按课程号升序建唯一索引,
-- Sno、Cno表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Couse(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

-- ====================================================================================
-- 删除索引
-- drop index <索引名>
-- 索引一经建立,就由系统使用和维护它,不需用户干预。
-- 建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引。
-- 这时,可以删除一些不必要的索引。
-- 删除索引时,系统会同时从数据字典中删去有关该索引的描述。
-- ======================================================================================

游标
--定义一个游标,游标名称为:usertb_cursor
declare usertb_cursor cursor for
select * from usertb
-- ================================
-- 游标使用流程
-- 声明->开启->取数据->关闭->删除
-- ================================
--开启游标
open usertb_cursor
--从游标中取数据
fetch next from usertb_cursor
--关闭游标
close usertb_cursor
--删除游标
deallocate usertb_cursor

-- ================================

 

 

原创粉丝点击