mysql事务、视图

like:用来模糊查询

#查询姓'王'的学生信息 like%:代表一个或多个任意字符(通配符)

select * from 表名 where 字段  like '王%'

#_:只匹配一个通配符(字符)

select * from 表名 where 字段 like'小_';

#%5%:只要包含5关键字符即可

select *from 表名 where 字段 like '%5%';

注意:%在后,就是以这个属性结尾。%在前,就是以这个属性开头,两个%就是包含这个属性

|------mysql 没有检查约束

create database mydata3;

 

use mydata3;

 

create table bank

(

    username varchar(20),

    bmoney float

)

--添加约束  作用:模拟一些故障(机器或人为)

alter table bank add constraint ck_bank_bmoney check(bmoney>=1);

 

insert into bank values('张三',1000);

 

insert into bank values('李四',1);

 

select * from bank;

 

--转账:把张三转到李四账户,转块

update bank set bmoney=bmoney-1000 where username='张三';

update bank set bmoney=bmoney+1000 where username='李四';

转账问题,常见的一种事务问题如何解决?

它需要两条update语句来完成,这两条语句是一个整体

如果其中任意一条出现错误,则整个转账业务也取消,这两个账户中的余额恢复到原来的数据,从而确保转账前与转账后的余额不变。

解决方式:用sqlserver的方式

--解决方式

/*

     declare:定义变量

     @@ERROR:跟踪sql语句如果sql语句有异常(问题),@@error自动计数

*/

declare

     @sumError int

begin

     begin transaction;--开启事务

     --赋值

     set @sumError=0;

     update bank set bmoney=bmoney-1000 where username='张三';

     set @sumError=@sumError+@@ERROR;

     update bank set bmoney=bmoney+1000 where username='李四';

     set @sumError=@sumError+@@ERROR;

     if(@sumError<>0)

     begin

         print 'sql语句执行有误!回滚中.....';

         rollback transaction;--事务回滚(后悔药)

     end

     else

     begin

         print '执行无误,事务提交中...........';

         commit transaction;--提交事务

     end

end;

|-----在mysql中事务是自动提交的

 

SET autocommit=0;

UPDATE info SET NAME='小明' WHERE id=3;

UPDATE info SET NAME='大明' WHERE id=4;

COMMIT;

DELETE FROM info WHERE id=8;

ROLLBACK;

SET autocommit=1;

|-----视图是一张虚拟数据表

#创建视图

create view 视图名称

as

  查询语句

#查看视图

select * from 视图名称;

#对视图进行修改,添加,删除

update 视图名称 set 字段=指定条件

delete from 视图名称

|-----多表的情况,能否用视图进行封装?

DELIMITER $$

 

USE `mydata`$$

 

DROP VIEW IF EXISTS `vw_subject_01`$$

 

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vw_subject_01` AS

SELECT

  `a`.`sid`         AS `sid`,

  `a`.`sexam`       AS `sexam`,

  `a`.`sdate`       AS `sdate`,

  `b`.`SubjectName` AS `subjectname`

FROM (`score` `a`

   JOIN `subject` `b`)

WHERE (`a`.`subjectno` = `b`.`SubjectNo`)$$

 

DELIMITER ;

注意:

|-----索引可以相对提高查询的性能,但不是绝对的!

----索引注意事项

查询时减少使用*返回全部列,不要返回不需要的列

索引应该尽量小,在字节数小的列上建立索引

WHERE子句中有多个条件表达式时,包含索引列的表达式应置于其他条件表达式之前

避免在ORDER BY子句中使用表达式

-------数据库的三范式:

1:保证每列的原子性   每列尽量不要再分割!

 

2:每张表只描述一件事情

 

3:如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)

3.1:后面的主键列,指的不是当前数据表中的主键!

3.2:指的是其它数据表中的主键列

多表的情况,尽量不要设置主外键(不是说不设主键,主键要设,不设外键!!!)







### MySQL视图事务的概念及用法 #### 视图 (View) 视图是一种虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。然而,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且是在引用视图时动态生成。 创建视图可以简化复杂的 SQL 操作,隐藏底层表结构的变化,以及控制访问权限。以下是创建视图的一个例子: ```sql CREATE VIEW high_value_products AS SELECT name, price FROM products WHERE price > 100; ``` 使用视图可以通过简单的 `SELECT` 查询来获取复杂查询的结果: ```sql SELECT * FROM high_value_products; ``` #### 事务 (Transaction) 事务是一系列作为一个单元一起执行的操作集合,在这些操作全部成功完成之后才会永久保存更改;如果任何一个部分失败,则整个过程都将回滚到最初状态,以此保持数据一致性[^2]。 开始一个新的事务并应用隔离级别的语句如下所示: ```sql SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; -- 执行一些SQL命令... COMMIT; -- 或者 ROLLBACK 如果出现问题的话. ``` #### 隔离级别与锁机制 MySQL 提供了四个标准的事务隔离级别,其中每一个都提供了不同程度上的保护以防其他并发事务的影响。较低级别的隔离允许更高的并发度但可能导致脏读、不可重复读等问题的发生;而较高的隔离级则反之[^3]。 - **READ UNCOMMITTED**: 可能会看到未提交的新记录或更新。 - **READ COMMITTED**: 不可见未提交变更,防止脏读。 - **REPEATABLE READ**(默认): 同一事务内多次读取相同结果集,避免幻影读现象。 - **SERIALIZABLE**: 完全串行化的处理方式,提供最严格的隔离程度。 关于锁机制方面,在较高隔离等级如 SERIALIZABLE 下,为了确保数据一致性和避免冲突,可能会施加更广泛的锁定策略,比如间隙锁(gap locks) 和临键锁(next-key locks),即使在某些版本中可能表现不同[^4]。 #### 示例代码展示 这里给出一段综合性的示例代码,展示了如何在一个高隔离级别的环境中安全地进行多条记录的同时修改: ```sql SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE user_id = 'alice'; UPDATE accounts SET balance = balance + 100 WHERE user_id = 'bob'; COMMIT; ``` 此段脚本首先设置了当前会话的最大隔离水平——即串行化(SERIALIZABLE),接着启动了一个新的事务,并在这个上下文中进行了两个账户之间的转账操作最后通过提交确认所有改变生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

brid_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值