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),语句失败,事务可回滚。
  • 如果批量插入时,某些记录违法约束,所有记录均不插入,事务仍活跃

回滚具体场景

  1. 主动触发回滚:当语句违反约束后,开发者手动执行 ROLLBACK,撤销事务中所有已执行的操作
  2. 自动回滚:事务中执行插入语句,若插入失败,会自动回滚该插入之前的事务操作。数据库连接中断,未提及的事务会被自动回滚

非事务存储引擎的约束处理

  1. 支持的约束及处理
    MyISAM 仅支持 主键、唯一、非空约束,处理逻辑:
  • 约束检查在语句执行时进行,违反约束则语句失败,但已执行的部分无法回滚(因无事务)。
  • 若批量操作中部分记录违反约束,MyISAM 会插入所有未违反约束的记录,跳过违反约束的记录

Windows 安装 MySQL

  1. 卸载 MySQL:1,停止服务 2,删除注册表 3,删除安装目录和 data 目录(如果有 data 目录的话)
    如果有删除残留可能就会导致安装出现错误
  2. 官方下载地址:https://dev.mysql.com/downloads/installer/
  3. alt text

MySQL 学习记录

MySQL 常用命令

  1. 连接和断开
    • 连接:mysql -h host -u user -p
    • 断开:quit
  2. 创建和使用数据库
    • 查看所有数据库:show databases;
    • 使用某个数据库:use 数据库名;
    • 创建数据库: CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET utf8mb4];
    • 删除数据库:DROP DATABASE [IF EXISTS] 数据库名;
  3. 表相关
    • 创建表:
      1
      2
      3
      4
      5
      6
      CREATE 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] 表名;
  4. 数据操作
    • 插入一条数据:INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
    • 更新一条数据:UPDATE 表名 SET 列1=值1, 列2=值2, ... [WHERE 条件];
    • 删除一条数据:DELETE FROM 表名 [WHERE 条件];
  5. 查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 基本查询(* 表示所有列)
SELECT 列1, 列2, ... FROM 表名 [WHERE 条件];

-- 示例1:查询所有用户
SELECT * FROM users;

-- 示例2:查询age > 28的用户的name和email
SELECT name, email FROM users WHERE age > 28;

-- 带排序(ORDER BY)
SELECT * FROM users ORDER BY age DESC; -- 按age降序排列

-- 带限制(LIMIT)
SELECT * FROM users LIMIT 10; -- 只返回前10条

-- 带分组(GROUP BY)和聚合函数
SELECT age, COUNT(*) FROM users GROUP BY age; -- 按age分组统计人数
  1. 用户与权限管理
    • 创建用户:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
    • 授权用户:GRANT 权限 ON 数据库名.表名 TO '用户名'@'主机名';
    • 刷新权限:FLUSH PRIVILEGES;
    • 查看用户权限:SHOW GRANTS FOR '用户名'@'主机名';
    • 撤销权限:REVOKE 权限 ON 数据库名.表名 FROM '用户名'@'主机名';
    • 删除用户:DROP USER '用户名'@'主机名';
  2. 事务操作
    • 开始事务:start transaction
    • 提交事务:commit
    • 回滚事务:rollback
  3. 批处理模式使用 mysql
    • 从文件中读入 mysql 语句:mysql < 文件名

MySQL 程序

MySQL 服务器管理

MySQL 服务器

配置服务器
  • 查看当前系统变量值:mysql> SHOW VARIABLES;