MySQL 学习记录
MySQL 概述
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
主要特性
- 多线程
- 提供事务性和非事务性的存储
- 使用非常快的 B 树磁盘表并具有索引压缩
- 使用非常快的基于线程的内存分配系统
- 使用优化的嵌套循环连接执行非常快的连接
- 使用哈希表作临时表
- 内置了对 SQL 语句的支持来检查,优化和修复表
MySQL 处理约束
MySQL 中的约束(Constraints)用于保证数据库表中数据的完整性和一致性,防止无效或不合理的数据进入表中。
在 MySQL 中约束的处理方式与存储引擎、事务机制密切相关。
存储引擎与约束、事务的关系
- 事务型存储引擎(InnoDB 默认),支持事务,支持检查所有约束,约束检查与事务回滚机制联动
- 非事务存储引擎,不支持事务,仅支持主键、唯一、非空约束,不支持外键和事务,约束违反时操作直接操作失败,无回滚
事务型存储的约束与回滚
InnoDB 是 MySQL 唯一支持事务和外键的存储引擎,其约束处理与事务的 ACID 特性(原子性、一致性等)深度绑定。
约束检查时机
检查发生在语句执行阶段,而非事务提交时执行
- 每条语句执行过程中会实时检查约束,若违反约束,语句立即终止
- 若语句执行成功,数据会先写入内存缓冲区,等待事务提交后才持久化到磁盘
约束违反时的事务行为
在食物中,若某条语句违反约束
- 当前语句直接失败,不会对数据产生任何影响
- 事务不会自动回滚,可选择执行 ROLLBACK,回滚事务中所有已经执行的操作或继续执行其他语句
不同约束的具体处理
- 主键 / 唯一约束:
插入 / 更新时若值重复,语句失败,事务保持活跃。需手动回滚或修正数据后继续。 - 外键约束:
若子表插入的外键值在主表中不存在,或主表删除 / 更新被引用的记录且未定义联动规则(如 ON DELETE CASCADE),语句失败。
例:主表 users 有 id=1,子表 orders 插入 user_id=2(主表无此记录),则插入失败,事务可回滚。 - 非空约束:
插入 / 更新时若列值为 NULL,语句失败。例如 name NOT NULL 列插入 NULL,语句终止,事务活跃。 - CHECK 约束:
插入 / 更新的值不满足 CHECK 条件(如 price > 0 但插入 -10),语句失败,事务可回滚。 - 如果批量插入时,某些记录违法约束,所有记录均不插入,事务仍活跃
回滚具体场景
- 主动触发回滚:当语句违反约束后,开发者手动执行 ROLLBACK,撤销事务中所有已执行的操作
- 自动回滚:事务中执行插入语句,若插入失败,会自动回滚该插入之前的事务操作。数据库连接中断,未提及的事务会被自动回滚
非事务存储引擎的约束处理
- 支持的约束及处理
MyISAM 仅支持 主键、唯一、非空约束,处理逻辑:
- 约束检查在语句执行时进行,违反约束则语句失败,但已执行的部分无法回滚(因无事务)。
- 若批量操作中部分记录违反约束,MyISAM 会插入所有未违反约束的记录,跳过违反约束的记录
Windows 安装 MySQL
- 卸载 MySQL:1,停止服务 2,删除注册表 3,删除安装目录和 data 目录(如果有 data 目录的话)
如果有删除残留可能就会导致安装出现错误 - 官方下载地址:https://dev.mysql.com/downloads/installer/
MySQL 学习记录
MySQL 常用命令
- 连接和断开
- 连接:
mysql -h host -u user -p - 断开:
quit
- 连接:
- 创建和使用数据库
- 查看所有数据库:
show databases; - 使用某个数据库:
use 数据库名; - 创建数据库:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET utf8mb4]; - 删除数据库:
DROP DATABASE [IF EXISTS] 数据库名;
- 查看所有数据库:
- 表相关
- 创建表:
1
2
3
4
5
6CREATE TABLE [IF NOT EXISTS] 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
...
[PRIMARY KEY (列名)]
); - 查看某个库的所有表:
show tables; - 查看某个表结构:
desribe 表名; - 修改表名:
ALTER TABLE 旧表名 RENAME TO 新表名; - 添加列:
ALTER TABLE 表名 ADD 列名 数据类型 [约束]; - 修改列:
ALTER TABLE 表名 MODIFY 列名 新数据类型 [新约束]; - 删除列:
ALTER TABLE 表名 DROP 列名; - 删除表:
DROP TABLE [IF EXISTS] 表名;
- 创建表:
- 数据操作
- 插入一条数据:
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...); - 更新一条数据:
UPDATE 表名 SET 列1=值1, 列2=值2, ... [WHERE 条件]; - 删除一条数据:
DELETE FROM 表名 [WHERE 条件];
- 插入一条数据:
- 查询数据
1 | -- 基本查询(* 表示所有列) |
- 用户与权限管理
- 创建用户:
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; - 授权用户:
GRANT 权限 ON 数据库名.表名 TO '用户名'@'主机名'; - 刷新权限:
FLUSH PRIVILEGES; - 查看用户权限:
SHOW GRANTS FOR '用户名'@'主机名'; - 撤销权限:
REVOKE 权限 ON 数据库名.表名 FROM '用户名'@'主机名'; - 删除用户:
DROP USER '用户名'@'主机名';
- 创建用户:
- 事务操作
- 开始事务:
start transaction - 提交事务:
commit - 回滚事务:
rollback
- 开始事务:
- 批处理模式使用 mysql
- 从文件中读入 mysql 语句:
mysql < 文件名
- 从文件中读入 mysql 语句:
MySQL 程序
MySQL 服务器管理
MySQL 服务器
配置服务器
- 查看当前系统变量值:
mysql> SHOW VARIABLES;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Myskill-blog!
