HOME AUTHORS

Mysql相关知识(主键、外键等)

2021年11月7日 11:21 2022年3月27日 01:19 更新
ali
Tags 主键 事务 数据

概述

Mysql是关系型数据库,是开源的,常用的数据库引擎是InnoDB(支持事务)、MyISAM(不支持事务)

使用Mysql时,不同的表还可以使用不同的数据库引擎,很常用的是InnoDB

数据库表每一行都是一个记录,每一列称为一个字段,每个字段都要定义数据类型

数据库表要建立”一对多“,”多对多“或”一对一“的关系

在关系数据库中,关系是通过主键和外键来进行维护的

主键

主键确定一条唯一的记录,一张数据库表中不能存在两条主键一样的数据

选取主键的一个基本原则是:不适用任何业务相关的字段作为主键

常见的可作为主键字段的类型有:

  1. BIGINT自增整数类型:数据库会自动为每一条记录分配一个自增整数

    BIGINT NOT NULL AUTO_INCREMENT

  2. 全局唯一GUID类型:使用一种全局唯一的字符串作为主键。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的。大部分编程语言都内置了GUID算法,可以自己预算出主键

联合主键

关系数据库实际上还允许通过多个字段唯一标识记录,即两个或以上的字段都可以设置为主键,这种主键被称为联合主键

对于联合主键,允许一列是重复的,只要不是所有的主键都重复就可以

不过联合主键用的很少,毕竟会使得关系表更复杂

外键

a表的外键是b表的主键,通过外键把a、b表关联起来

通过定义外键约束,数据库可以保证不会插入无效的数据

通过外键可以实现关系数据库一对一、一对多、多对一的关系

索引

索引是关系数据库中对某一列或多列的值进行预排序的数据结构。通过使用索引,可以让数据库不再全表扫描,而是直接定位到符合条件的数据,能大大加快查询速度

如果要经常根据score列进行查询,就可以对score列建立索引:

        ALTER TABLE students
          ADD INDEX idx_score(score);

索引名称是任意的,如果索引有多列,用进行隔开:

       ALTER TABLE students
          ADD INDEX idx_score_name(score,name)

一张数据库表可以创建多个索引

索引效率

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引的效率越高。反过来,如果记录的列存在大量相同的值,为该列创建索引就没有多大意义

对于主键,关系型数据库会自动为其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一

索引优缺点

唯一索引(UNIQUE INDEX)

有些列看上去数据会是唯一的,比如像身份证号、手机号等,这些虽然跟业务紧密相关不能作为主键,但是可以为它们设置唯一索引(既创建了索引,又建立了字段唯一的性质,即这个字段值是唯一的,不能有相同的两个记录)

例如:

       ALTER TABLE students
         ADD UNIQUE INDEX uni_idCard(idCard);

也可以只对某一列添加唯一约束,而是唯一索引

      ALTER TABLE students
       ADD CONSTRAINT uni_name UNIQUE(name);

这种唯一约束虽然没有创建索引,但是保证了该列的值是唯一的,不能出现相同的两条记录。

分页查询

使用LIMIT m OFFSET n可以对结果集进行分页,每次查询只返回结果集的一部分

聚合查询

查询某张表一共有多少条记录,可以使用内置函数count()

select count(*) from students;

虽然查询结果是一个数字,但是查询结果其实还是一个二维表,只不过只有一行一列,并且列名是count(*)

可以设置别名为num:

select count(*) num from students;

其他内置函数

ps: max()和min()并不限制是数值类型,如果是字符类型的话,分别会返回排序最后和排序最前的字符

ps:如果聚合查询的where条件没有匹配到任何行,那么count()会返回0,而sum()max()min()avg()会返回NULL

连接查询

事务

事务特点:ACID

并发事务带来的问题

ps:不可重复读和幻读的区别:

事务隔离级别

sql标准定义了4种事务隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内或事务间是可见的,哪些是不可见的。低级别的隔离级别一般支持更高的并发处理,并且拥有更低的系统开销

以下列出的事务隔离级别,从低到高列举: