#TCL语言事务控制语言P134
/*
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
案例:转账
张三:余额1000
李四:余额1000
update 表 set 张三的余额=500 where name = '张三';
update 表 set 李四的余额=1500 where name = '李四';
两者需要同时执行,如果其中一个失败那么久全部失败
innodb存储引擎支持事务
事务的acid属性:1.原子性:事务不可再分割,事务中执行单元要么全部执行,要么都不执行
2.一致性:从一个一致性状态到另一个一致性状态
3.隔离性:不受其他事务的干扰
4.持久性:永久性改变
隐式事务:没有明显的开启和结束的标记
例如:insert、update、delete
显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0;#只针对当前的对话有效
步骤1:开启事务
set autocommit=0;
start transaction;
步骤2:编写事务中的sql语句(select insert update delete)
步骤3:结束事务
commit 提交事务
rollback;回滚事务
*/
SHOW VARIABLES LIKE 'autocommit';
SHOW ENGINES;
#事务的创建:
SET autocommit=0;
START TRANSACTION;
UPDATE acount SET balance=500 WHERE NAME = '张三';
UPDATE acount SET balance=1500 WHERE NAME = '李四';
COMMIT;
#或不执行:回滚
ROLLBACK;
#使用delete删除回滚有效,使用truncate删除后,回滚无效
#savepoint 节点名;设置节点、保存点的方法,可以回滚到保存的断点处
#rollback to savepoint;返回回滚点
#需要设置隔离级别以避免出现脏读、幻读,不可重复读的现象
#level read uncommitted 出现脏读、不可重复读、幻读
#level read committed 避免脏读,出现不可重复读、幻读
#level repeatable read 避免脏读、不可重复读,出现幻读
#level serializable 避免脏读、幻读、不可重复读
#mysql中默认为repeatable read
#oracle中默认read committed
#视图:
/*
含义:虚拟表,和普通表一样使用
临时性:
*/
#1.创建视图:
CREATE VIEW v1
AS
SELECT last_name FROM emplyees;
#2.使用
SELECT * fron v1 WHERE last_name LIKE '李四';
#视图的作用:
/*
1.实现了sql的重用
2.简化了sql操作
3.保护数据,提高了安全性
*/
#视图的修改
#create or replace v2 as select...#创建或修改表的内容
#alter view 视图名 as select...
#查看视图:select * from v2;
#删除视图:drop view v2;
#视图更新:更新时会对原始表产生影响,但大多数视图不允许增删改即可
#视图和表的对比
#create view 没有占用实际物理空间只保存sql逻辑 可增删改查,但一般不能
#create table 占用实际物理空间 可增删改查
#查看是否有键-key
SHOW INDEX FROM mytable;
#P148
#例如本身有一个专业,但目前该专业取消了,那么有些学生的专业写的是被取消的专业,那么将这个专业都设置为空
#级联删除
#1.先添加能够执行级联删除的语句
ALTER TABLE stuinfo CONSTRAINT fk_stu_majoe FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;#在添加外键的语句后面添加即可
#2.删除专业表中的3号专业
DELETE FROM major WHERE id=3;#即可实现删除主表中的id为3的专业,同时删除从表中的对应majorid为3的整行的值
#级联置空
#1.先添加能够执行级联置空的语句
ALTER TABLE stuinfo CONSTRAINT fk_stu_majoe FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;#在添加外键的语句后面添加即可
#2.删除专业表中的3号专业
DELETE FROM major WHERE id=3;#即可实现删除主表中的id为3的专业,同时删除从表中的对应majorid为3的值设为null