MySQL 课程实验一般包括:建库建表、约束、增删改查、多表连接、子查询、索引、视图、存储过程、权限、备份恢复等,下面整理实验高频报错、踩坑问题、原因和解决办法,适合课程实验报告直接使用。
一、连接登录类问题
Access denied for user 'root'@'localhost'
原因:密码错误;root 账户不允许本地登录;刚安装未设置密码。
解决:核对密码;重置 root 密码;确认 host 权限。
Can't connect to MySQL server on 'localhost'(10061/2003)
原因:MySQL 服务没启动;端口 3306 被占用;防火墙拦截。
解决:Windows 启动 mysql 服务;Linux
systemctl start mysqld;检查 3306 端口。
客户端编码乱码,中文显示问号???
原因:客户端、连接字符集不是 utf8mb4。
解决:登录执行
set names utf8mb4;;配置 my.ini/my.cnf 字符集。
二、数据库、表创建实验问题
Unknown database 'xxx'
原因:数据库不存在就直接 use;数据库名大小写问题 (Linux 区分大小写,Windows 不区分)。
解决:先
create database 库名;再use 库名。
Table 'xxx' doesn't exist
原因:没有 use 选中数据库;表名输错;选错数据库。
Field doesn't have a default value
原因:字段设置 NOT NULL,插入数据不给值,又没有默认值。
解决:插入提供该字段值;给字段设置
DEFAULT 'xxx';取消 not null。
Incorrect string value: 'xxx' for column
原因:表字段字符集不是 utf8mb4,存入中文、特殊 emoji。
解决:建表指定
CHARSET=utf8mb4。
主键重复 Duplicate entry 'xx' for key 'PRIMARY'
原因:主键字段插入已经存在的值;自增主键手动指定重复值。
解决:主键不能重复;自增列不手动赋值。
外键创建失败 Cannot add foreign key constraint
实验高频!
常见原因: ① 两个字段数据类型、长度、符号不一致; ② 被引用的父表主键不存在该值; ③ 父表引擎不是 InnoDB(MyISAM 不支持外键); ④ 字符集、排序规则不一样。
解决:统一字段类型;父表先插入主记录;确认引擎为 InnoDB。
三、DML 增删改实验(insert/update/delete)
更新 / 删除无报错,但是影响行数 0 rows affected
原因:where 条件写的不对,没有匹配到任何记录;字符串值大小写、空格问题。
排查:先用
select * from 表 where 条件看能不能查到数据。
update 忘记写 where 条件,全表数据被全部修改
实验大坑!update 表 set col=val; 不加 where 会更新整张表。
建议:实验先 select 验证条件,再执行 update。
delete 删除记录,自增 id 不重置
说明:delete 只删数据,自增计数器不变;
truncate table清空表才重置自增,truncate 不能带 where。
Data truncated for column 字段
原因:插入的数据长度超过字段定义长度;数值超出范围。
解决:缩短数据;扩大字段长度。
四、DQL 查询实验(select、多表、子查询、分组)
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 分组字段。
多表连接查询结果数据重复,笛卡尔积
原因:join 缺少连接条件,没有写 on;where 连接条件漏写。
现象:返回成千上万条无意义组合。
解决:内连接必须写 on 关联两张表主键外键。
子查询返回多于 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)
count (*)、count (列)、count (1) 混淆实验出错
count (*) 统计全部行(包含 null);count (字段) 忽略该字段 NULL 值。
order by 排序不生效
原因:limit 写在 order by 前面;字段是字符串类型存数字,按字典序排序。
limit 分页出错 limit m,n
limit m,n:m 偏移量,n 取多少条,不是从 m 到 n。
五、索引、视图实验
创建索引后查询速度看不出变化
原因:数据量太少实验表只有几条数据;查询条件不走索引;索引失效(like % 开头、函数操作字段)。
视图更新失败 Can not update view
原因:视图包含聚合函数、group by、distinct、多表连接,视图不可更新。
知识点:不是所有视图都可以 update/insert。
drop view if exists 不加 if exists,视图不存在直接报错
六、存储过程、函数实验
You have an error in your SQL syntax 语法报错
高频:没有修改语句结束符 delimiter。
DELIMITER // -- 把结束符临时改为//
create procedure p1()
begin
-- sql语句
end //
DELIMITER ; -- 改回分号
不修改 delimiter,MySQL 遇到;就认为存储过程定义结束,直接报语法错。
存储过程调用错误 call 存储名 (); 忘记括号
函数返回值不匹配,returns 类型和 return 返回数据不一致
七、权限、备份恢复实验
grant 授权后用户登录依旧没有权限
忘记执行
flush privileges;;授权 host 错误(% 代表所有主机,localhost仅本机)。
mysqldump 备份报错,恢复后中文乱码
备份指定字符集;恢复的时候 source 导入 sql 文件注意编码。
source 导入 sql 失败:路径有中文、空格;使用反斜杠转义问题。
八、容易混淆的概念(实验简答题常考)
delete、truncate、drop 区别
delete:DML,删除行,可以回滚,不重置自增
truncate:DDL,清空整张表,不可回滚,重置自增
drop:DDL,删除整个表结构 + 数据 + 索引
inner join、left join、right join 结果混淆
char 与 varchar 区别:char 定长,varchar 变长
null 和 '' 空字符串不是同一个东西;
is null,不能用= null!
大坑:where col=null 查不到任何 null 数据,必须 where col is null。
九、实验报告常见问答题
外键约束的作用?创建失败有哪些因素?
ONLY_FULL_GROUP_BY 是什么,如何处理分组报错?
null 值查询为什么不能使用 =null?
视图的优缺点,什么视图不能更新?
delete 与 truncate 的差异
索引是不是越多越好,索引的优缺点