易君召
发布于 2026-08-21 / 作者:易君召 / 1 阅读
0

MySQL 数据库实验常见问题

MySQL 课程实验一般包括:建库建表、约束、增删改查、多表连接、子查询、索引、视图、存储过程、权限、备份恢复等,下面整理实验高频报错、踩坑问题、原因和解决办法,适合课程实验报告直接使用。

一、连接登录类问题

  1. Access denied for user 'root'@'localhost'

  • 原因:密码错误;root 账户不允许本地登录;刚安装未设置密码。

  • 解决:核对密码;重置 root 密码;确认 host 权限。

  1. Can't connect to MySQL server on 'localhost'(10061/2003)

  • 原因:MySQL 服务没启动;端口 3306 被占用;防火墙拦截。

  • 解决:Windows 启动 mysql 服务;Linux systemctl start mysqld;检查 3306 端口。

  1. 客户端编码乱码,中文显示问号???

  • 原因:客户端、连接字符集不是 utf8mb4。

  • 解决:登录执行 set names utf8mb4;;配置 my.ini/my.cnf 字符集。

二、数据库、表创建实验问题

  1. Unknown database 'xxx'

  • 原因:数据库不存在就直接 use;数据库名大小写问题 (Linux 区分大小写,Windows 不区分)。

  • 解决:先create database 库名;use 库名

  1. Table 'xxx' doesn't exist

  • 原因:没有 use 选中数据库;表名输错;选错数据库。

  1. Field doesn't have a default value

  • 原因:字段设置 NOT NULL,插入数据不给值,又没有默认值。

  • 解决:插入提供该字段值;给字段设置DEFAULT 'xxx';取消 not null。

  1. Incorrect string value: 'xxx' for column

  • 原因:表字段字符集不是 utf8mb4,存入中文、特殊 emoji。

  • 解决:建表指定 CHARSET=utf8mb4

  1. 主键重复 Duplicate entry 'xx' for key 'PRIMARY'

  • 原因:主键字段插入已经存在的值;自增主键手动指定重复值。

  • 解决:主键不能重复;自增列不手动赋值。

  1. 外键创建失败 Cannot add foreign key constraint

实验高频!

  • 常见原因: ① 两个字段数据类型、长度、符号不一致; ② 被引用的父表主键不存在该值; ③ 父表引擎不是 InnoDB(MyISAM 不支持外键); ④ 字符集、排序规则不一样。

  • 解决:统一字段类型;父表先插入主记录;确认引擎为 InnoDB。

三、DML 增删改实验(insert/update/delete)

  1. 更新 / 删除无报错,但是影响行数 0 rows affected

  • 原因:where 条件写的不对,没有匹配到任何记录;字符串值大小写、空格问题。

  • 排查:先用select * from 表 where 条件看能不能查到数据。

  1. update 忘记写 where 条件,全表数据被全部修改

  • 实验大坑!update 表 set col=val; 不加 where 会更新整张表。

  • 建议:实验先 select 验证条件,再执行 update。

  1. delete 删除记录,自增 id 不重置

  • 说明:delete 只删数据,自增计数器不变;truncate table清空表才重置自增,truncate 不能带 where。

  1. Data truncated for column 字段

  • 原因:插入的数据长度超过字段定义长度;数值超出范围。

  • 解决:缩短数据;扩大字段长度。

四、DQL 查询实验(select、多表、子查询、分组)

  1. ONLY_FULL_GROUP_BY 报错(非常常见)

报错:Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

  • 原因:sql_mode 开启 ONLY_FULL_GROUP_BY,select 中非聚合字段必须出现在 group by 中。

  • 场景实验:分组查询 select 写了不在 group by 的普通字段。

  • 解决: 1)修改 sql_mode; 2)正确 SQL:select 分组字段,聚合函数 from table group by 分组字段。

  1. 多表连接查询结果数据重复,笛卡尔积

  • 原因:join 缺少连接条件,没有写 on;where 连接条件漏写。

  • 现象:返回成千上万条无意义组合。

  • 解决:内连接必须写 on 关联两张表主键外键。

  1. 子查询返回多于 1 行 Subquery returns more than 1 row

  • 原因:=后面子查询返回多条记录,不能用等于,改用in

  • 错误:select * from student where id = (select id from class)

  • 正确:select * from student where id in (select id from class)

  1. count (*)、count (列)、count (1) 混淆实验出错

  • count (*) 统计全部行(包含 null);count (字段) 忽略该字段 NULL 值。

  1. order by 排序不生效

  • 原因:limit 写在 order by 前面;字段是字符串类型存数字,按字典序排序。

  1. limit 分页出错 limit m,n

  • limit m,n:m 偏移量,n 取多少条,不是从 m 到 n。

五、索引、视图实验

  1. 创建索引后查询速度看不出变化

  • 原因:数据量太少实验表只有几条数据;查询条件不走索引;索引失效(like % 开头、函数操作字段)。

  1. 视图更新失败 Can not update view

  • 原因:视图包含聚合函数、group by、distinct、多表连接,视图不可更新。

知识点:不是所有视图都可以 update/insert。

  1. drop view if exists 不加 if exists,视图不存在直接报错

六、存储过程、函数实验

  1. You have an error in your SQL syntax 语法报错

  • 高频:没有修改语句结束符 delimiter。

DELIMITER //   -- 把结束符临时改为//
create procedure p1()
begin
-- sql语句
end //
DELIMITER ;    -- 改回分号

不修改 delimiter,MySQL 遇到;就认为存储过程定义结束,直接报语法错。

  1. 存储过程调用错误 call 存储名 (); 忘记括号

  2. 函数返回值不匹配,returns 类型和 return 返回数据不一致

七、权限、备份恢复实验

  1. grant 授权后用户登录依旧没有权限

  • 忘记执行 flush privileges;;授权 host 错误(% 代表所有主机,localhost仅本机)。

  1. mysqldump 备份报错,恢复后中文乱码

  • 备份指定字符集;恢复的时候 source 导入 sql 文件注意编码。

  1. source 导入 sql 失败:路径有中文、空格;使用反斜杠转义问题。

八、容易混淆的概念(实验简答题常考)

  1. delete、truncate、drop 区别

  • delete:DML,删除行,可以回滚,不重置自增

  • truncate:DDL,清空整张表,不可回滚,重置自增

  • drop:DDL,删除整个表结构 + 数据 + 索引

  1. inner join、left join、right join 结果混淆

  2. char 与 varchar 区别:char 定长,varchar 变长

  3. null 和 '' 空字符串不是同一个东西;is null,不能用 = null

大坑:where col=null 查不到任何 null 数据,必须 where col is null。

九、实验报告常见问答题

  1. 外键约束的作用?创建失败有哪些因素?

  2. ONLY_FULL_GROUP_BY 是什么,如何处理分组报错?

  3. null 值查询为什么不能使用 =null?

  4. 视图的优缺点,什么视图不能更新?

  5. delete 与 truncate 的差异

  6. 索引是不是越多越好,索引的优缺点