MySQL之五种约束、索引、视图和事务

1、MySQL的五种约束

  • 主键约束 PRIMARY KEY
  • 唯一约束 UNIQUE KEY
  • 默认约束 DEFAULT
  • 非空约束 NOT NULL
  • 外键约束 FOREIGN KEY

1.1主键约束 PRIMARY KEY

语法: 在定义字段的属性后面添加 PRIMARY KEY ,一般AUTO_INCREMENT和主键一起使用,让主键自增长
描述: (1)每张表只能有一个主键;(2)主键保证记录的唯一性;(3)主键自动为NOT NULL
案例: 这里写图片描述

1.2、唯一约束 UNIQUE KEY

语法: 在定义字段的属性后面添加 UNIQUE KEY
描述: 使该字段的每条数据唯一
案例: 这里写图片描述

1.3、默认约束 DEFAULT

语法: 在定义字段的属性后面添加 DEFAULT 默认数据
描述: 当该字段不添加数据的时候,会自动添加默认值
案例: 这里写图片描述
添加一条数据并查看: 这里写图片描述主键默认增加,所以不用添加,可以看到age默认为0

1.4、非空约束 NOT NULL

语法: 在定义字段的属性后面添加 NOT NULL
描述: 该字段在添加数据时,不能为空
案例: 这里写图片描述
添加一条该字段为空的数据: 这里写图片描述

1.5、外键约束 FOREIGN KEY

首先创建两张表:

# 创建部门表 bumen
CREATE TABLE bumen(
    `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '部门编号',
    `dname` VARCHAR(20) NOT NULL COMMENT '部门名称',
    `darea` VARCHAR(20) NOT NULL COMMENT '办公地点',
    `dreg_time` DATETIME NOT NULL COMMENT '创建时间',
    `ddesc` TEXT COMMENT '描述',
    `dremark` VARCHAR(200) DEFAULT '待完善备注信息' COMMENT '备注'
)
# 创建员工表 emp
CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工编号',
    NAME VARCHAR(20) NOT NULL COMMENT '员工姓名',
    age INT DEFAULT 0 COMMENT '员工年龄',
    pid INT COMMENT '上级编号',
    reg_time DATETIME COMMENT '入职时间',
    bm_id INT NOT NULL COMMENT '所属部门编号'
)
语法: 这里写图片描述
描述: 修改表,给表的某个字段添加外键约束
案例: 这里写图片描述
添加引用表没有的数据: 这里写图片描述关联的字段中没有这个数据,所以添加失败!
删除父表中被引用的一条数据: 这里写图片描述 因为该字段存在外键引用,所以删除失败!
注意1: 添加外键约束还有一种是在创建表的时候直接添加!
注意2: 外键约束存在隔离级别,即表与表的关联关系。隔离级别就是数据库管理系统检查外键的模式 (1)CASCADE【默认】: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。(2)NO ACTION: 拒绝删除或者更新父表 (3)SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。(4)RESTRICT : 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

2、索引

语法: 增加索引:ALTER TABLE tab_name ADD INDEX 'name_index'(col_name); 删除索引:ALTER TABLE tab_name DROP INDEX 'name_index';
描述: 索引的存在:就是为了索引列作为条件时,提升查询效率
案例: 这里写图片描述这里写图片描述
注意1: 一般生成索引在创建表时就已加上,不要在数据表中有大量数据时,给某个字段生成索引,会将表锁住
注意2:索引会为查询、修改数据提高效率,但是会降低增加、删除的效率!所以一般只给频繁要查询的字段添加索引

3、视图

视图(VIEW):是一种特殊的表格 [不能直接称为表格],是一种可以将复杂的SQL语句执行的结果进行动态结果存储的数据对象。
每次查询视图,都会自动更新视图对应的SQL语句查询的结果。

语法: CREATE VIEW 视图名 AS sql语句;
描述: 每次查看视图时,就会自动执行sql语句
案例: 这里写图片描述这里写图片描述

4、事务

4.1、事务:所谓事务,就是要完成一件事情,在这个事情中包含了多个任务
当所有的任务都执行成功,这个事情就是成功的:所有改动的数据生效
当任意一个任务执行失败,这个事情就是失败的:所有改动的数据回退
对于事务的管理操作:称为事务管理

4.2、术语解释:

  • 开启事务【开始记录一件事情中的多个任务】
  • 执行事务 执行SQL语句【正常情况下,一条语句就是一个任务】
  • 提交事务【成功】|回滚事务 【回到数据库执行之前的状态】

4.3、事务管理关键词:

  • 开启事务:start transaction | begin | set autocommit = 0(这一种用的少)
  • 执行SQL语句->多条SQL语句
  • 提交事务 Commit | 回滚事务 Rollback

4.4、案例:

# -- 下面的两条SQL语句接受事务管理:必须同时成功 提交数据;否则数据还原
#开启事务
-- start transaction;

BEGIN

INSERT INTO bumen(dname, darea, dreg_time, ddesc)
    VALUES('监察', 'DSJ102', '2018-08-29 00:00:00', '学生建设、教学质量监管');

INSERT INTO emp(NAME, age, pid, reg_time, dept_id)
    VALUES('老曾', 34, 4, '2018-08-29 00:00:00', 10);

开启事务,修改数据表的数据,由于我们开启了事务,数据表真实的数据,并没有同步更新。
这样能保证当我们这个事务中的所有SQL语句都执行成功时,再提交事务,保持数据的完整性。

COMMIT; # 提交事务,一旦提交事务,回滚事务,不在生效。
# 或
ROLLBACK; # 回滚事务,返回到刚才SQL语句执行前的状态。

4.5、事务的基本要素(ACID)

  1. 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
  2. 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  3. 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

4.6、事务的并发问题:

  1. 读脏数据:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  2. 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  3. 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

    小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

猜你喜欢

转载自blog.csdn.net/qq_41963640/article/details/82184731