常见约束


数据库约束就是一种限制,用于限制表中行和列的数据,为了保证表中的数据准确和可靠

约束分类

六大约束


NOT NULL :       非空约束,用于保证该字段的值不能为空 DEFAULT:       默认约束,用于保证该字段有默认值 PRIMARY  KEY:  主键约束,用于保证该字段的值具有唯一性 UNIQUE:唯一约束,用于保证该字段的值具有唯一性,可以为空 CHECK:  检查约束,【mysql中不支持】 FOREIGN  KEY:外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关系列的值 添加约束的时机:

  • 创建表时
  • 修改表时


约束的添加分类:

  • 列级约束
  • 六大约束语法上都支持,但是外键约束没有效果
  • 直接在字段名和类型后面追加 约束类型即可
  • 表级约束
  • 除了非空、默认,其他都可以支持。

主键和唯一的对比


主键约束 PRIMARY KRY


  • PRIMARY KRY 主键 是唯一的 一张表只能有一个主键
  • AUTO_INCREMENT 一定要和主键连用
  • 但主键不一定要和 AUTO_INCREMENT 连用
  • 主键一定是非空的 NOT NULL
  • 唯一约束 UNIQUE KEY

UNIQUE KEY 唯一约束


  • 唯一约束可以保证数据的唯一性
  • 唯一约束的字段可以为空
  • 每张数据表可以有存在多个唯一约束

事务


将一组SQL放在一个批次中去执行,要么都成功,要么都失败 MySQL 是默认开启事务自动提交的


事务原则   ACID


原子性(Atomicity)

原子性是指一个不可分割的工作单位,食物中的操作,要么都发生,要么都不发生 原子的实现原理是通过undo log 来进行实现的,undolog是为了实现事务的原子性,在mysql 数据库innodb存储引擎中,还用 undo log 来实现多版本并发控制,简称(MVCC);在操作任何数据之前,首先将数据被分到一个地方(这个存储备份的地方称为 undo log),然后进行数据的修改,如果出现了错误或者用户执行了rollback语句,系统可以利用undo log中的备份将数据恢复到事务开始之前的状态。 注意:undo log 是逻辑日志,可以理解为: 当delete一条记录时,Undo log中会记录一条对应的insert 记录 当insert 一条记录时,undolog中会记录一条delete记录 当update 一条记录时,它记录与之相反的update记录 一致性(Consistency)

最终一致性,过程一致性,事物的前后数据完整性必须保证一致 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事物的操作数据所干扰,多个并发事务之间要相互隔离。 持久性(Durability)

持久性是指一个事务一旦被提交,他对数据库中的数据改变是永久性的,接下来即使数据库发生故障也不应该对其有任何影响,事务一旦提交就不可逆了。 redo log 和undolog相反,redolog记录的是新数据的备份。在事务提交前,只要将redolog 持久化即可,不需要将数据持久化,当系统崩溃时,虽然数据没有持久化,但是redolog已经持久化,系统可以根据redo log的内容,将所有数据恢复到最新状态。


事务的隔离级别1111111


脏读

指一个事务读取了另外一个事务未提交的数据。 不可重复读

在一个事物内读取表中的某一行数据的时候,多次读取结果不同(这不一定是错误,只是某些场合不对) 幻读(虚读)

在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

--mysql 是默认开启事务自动提交的set autocommit = 0  --关闭自动提交事务set autocommit = 1  --开启自动提交事务(默认的)--手动处理事务SET autocommit = 0; --关闭自动提交事务--事务的开启START TRANSACTION--标记一个事务的开始,从这个之后的SQL都在同一个事务内SQL语句......--提交   (成功 持久化)commit--回滚(失败  回到原来的样子)rollback --事务结束SET autocommit = 1;  --开启自动提交

mysql参数存储过程 mysql存储过程参数约束_mysql参数存储过程

数据库事务的隔离性


数据库系统必须具有隔离并发运行各个事务的能力,使它们不会互相影响,避免各种并发问题。 一个事务与其他事务隔离的程度成为隔离级别,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

select @@tx_isolation;--查看数据库的事务隔离级别set session transaction isolation level 隔离级别;--设置数据库隔离级别

数据库的4种隔离级别



隔离级别

描述

READ UNCOMMITED    (读未提交的数据)

允许事务读取未被其他事务提交的变更、脏读、不可重复读和幻读的问题出现

READ COMMITED      (读已提交的数据)

只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复 读和幻读问题仍然可能出现

REPEATABLE  READ      (可重复读)

确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读的问题依然存在

SERIALIZABLE             (串行化)

确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下。

  • Oracle支持的2种事务隔离级别:read commited、 serializable。Oracle默认的事务隔离级别为:read commited(读已提交)
  • MySQL支持四种事务隔离级别,mysql默认的事务隔离级别为 repeatable read(可重复读)

视图


视图的含义:视图就是虚拟的表,和普通表一样的使用,是mysql 5.1版本出现的新特性,是通过表动态生成数据 如果我们查询是一个复杂的查询,查询涉及到多张表,那么我们就可以把复杂的查询封装成一个视图。只保存SQL逻辑,不保存查询结果 应用场景:

  • 多个地方用到同样的查询结果
  • 该查询结果使用的SQL语句比较复杂
--视图的创建语法create view 视图名as查询语句;--视图的修改语法1create or replace view 视图名as查询语句;--视图的修改语法2alter view 视图名as查询语句;--删除视图drop view 视图名,视图名...;--查看视图1desc 视图名;--查看视图show create view 视图名;


视图的好处:


  • 重用SQL语句
  • 简化复杂的SQL操作,不必知道它的查询细节
  • 保护数据,提高安全性

视图和表的对比



类型

创建语法关键字

物理空间的占用

使用

视图

create view

只保存SQL逻辑,几乎可以忽略

增删查改,一般不能增删改


create table

保存了数据

增删查改

存储过程


一组预先编译好的SQL语句的集合,可以理解成批处理语句

  • 提高代码的重要性
  • 简化操作
  • 减少了编译次数,并且减少了和数据库服务器的连接次数,提高了效率

创建语法


create procedure 存储过程名(参数列表)begin存储过程体(一组合法的sql语句)end参数列包含三部分参数模式参数名参数类型eg:  IN stuname VARCHAR(20)参数模式:IN*(该参数可以作为输入,即是该参数需要调用方法传入值)OUT(该参数可以作为输出,也就是该参数可以作为返回值) INOUT(该参数既可以输入又可以输出,也就是该参数既需要传入值,又可以返回值)


如果存储过程体仅仅只有一句话,BEGIN   END  可以省略,存储过程体中的每条SQL语句要求必须加分号,存储过程体结尾可以使用DELIMITER 重新设置 语法: DELIMITER    结束标记     eg:  DELIMITER $ 调用语法

CALL 存储过程名(实参列表);