zoukankan      html  css  js  c++  java
  • 学习mysql中遇到的问题以及解决(一)

    学习mysql中遇到的问题以及解决(一)

    问题1:字段加上单引号' ' 就报错啦,去掉单引号' '就正常了

    问题2:default 加了括号就报错--同样,找到一个解释是:因为mysql自身版本问题(那咱就去()吧)。

    问题3:mysql有时候报错是因为你重新修改了操作完没有注意语句的执行顺序啦

    问题4:使用MySQL执行update或者delete的时候报错:~(报错提示要选主键或消除安全模式)

    问题5:报错:where 不能直接使用内置函数噢!解决:通过嵌套查询—子查询的方式,使得内置函数不直接接触where啦!

    问题6:select 时 聚合函数旁边有其他普通属性时,要使用group by,且group by 要包含除了聚合函数里的属性外的其他所有普通属性,因为mysql默认的模式 sql_mode是:

    所选择的列都要参与分组,所以不小心写错,报错提示:所选的列既不在聚合函数也不是主键。

    问题7:select+ select的查询时,被当做临时表的select要起个别名。因为派生表(临时表),需要起别名区分开来,才能当成一张普通表查询里边自己想要的属性。

    问题8:关键字报错问题:保留关键字/非保留关键字:其中保留关键字需要加引号`` (``符号在键盘1旁边哈!)

    问题9:两张表的共同属性关系是:1对多,(1对多 的外键引用关系不适合用内连接!)

    ----解决:需要起别名,“副表”,另外一张表的作用来区分开。

    问题10:一个表不能有2个主键,因为主键代表数据的物理组织形式,所以不能存在2个。但是允许用多个字段联合组成主键。

    解决例子:使用(主键组合)alter table SC add primary key(`Sno`,`Cno`);

    1,字段加上单引号' ' 就报错啦,去掉单引号' '就正常了---找到一个解释的原因是说,mysql版本的自身原因,应该是新版的变量属性设计的时候,都系统为你加好了 单引号' '我的猜测),因为对于新版的变量属性,一旦加单引号必报错,

    所以mysql8,一旦是变量,就不要再加单引号了。哈哈哈,宝宝,这里的符号搞错了噢,是那个长得跟单引号很像的符号反引号噢。修改符号为反引号,就不再报错了。

    同样,

     补充:正确的反引号``

     2,default 加了括号就报错--同样,找到一个解释是:因为mysql自身版本问题。

     

    3,mysql有时候报错是因为你重新修改了操作完没有注意语句的执行顺序啦,例如,上次执行添加进表(表的id是以主键添加进去),

    第二次,你删除掉表id 的主键属性,然后重新修改表以加约束主键id,然后只执行最后这一句语句会报错的,提示Multiple primary key

    4,使用MySQL执行update或者delete的时候报错:

    例如执行:①delete from  Address; (Address 是一张表) 或者 执行:②delete from  Address where StuName='赵丽颖';      执行 都会报错!:

    You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column  To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

    查看mysql安全模式状态:  show variables like 'sql_safe_updates';

    因为版本较新的MySQL是在safe-updates模式下进行sql操作的,这个模式会导致在非主键条件下无法执行update或者delete
    
    解决:设置一下取消安全模式即可:
     set sql_safe_updates=0; /*取消安全模式*/

     当然设置回安全模式 set sql_safe_updates=1; /*设置安全模式*/

    5,报错:where 不能直接使用内置函数噢!

    举例:

    解决:通过嵌套查询—子查询的方式,使得内置函数不直接接触where啦!

    6,group by 分组查询时,select 后边出现的列一定要参与分组【聚合函数的列就可以省略啦】

    (1)select * from stu group by (stuId);     #stuId 是主键噢,正常执行

               select * from stu group by(telNum);        #telNum 非主键,报错

    错误:SELECT list is not in GROUP BY clause and contains nonaggregated column 'studb.stu.StuId' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    翻译错误:所选的列既不在聚合函数也不是主键,错误原因是因为sql_mode 模式是所选择的列都要参与分组

    (2)select 时 聚合函数旁边有其他普通属性时,要使用group by,且group by 要包含除了聚合函数里的属性外的其他所有普通属性:

    (3)select ScoreId,SubjectId from score group by (ScoreId,SubjectId);

    报错:操作数应包含1列:Operand should contain 1 column(s)。

    把括号去掉,不再把两个列合在一起,单独成一列:select ScoreId,SubjectId from score group by ScoreId,SubjectId;

    7,左连接后:报错:Every derived table must have its own alias

     把(查到的学生信息对应考试信息,出现null,当做一个临时表)---派生表,需要起别名,才能当成一张普通表查询里边自己想要的属性。

    例如:#查询缺考学生信息

    把(查到的学生信息对应考试信息,出现null,当做一个临时表)

    #查询缺考学生信息
    select StuId,StuName from(
    #学生表与成绩表的左连接,可以得到学生信息对应考试表,出现考试信息为null
    select stu.StuId,StuName,Score from stu 
    left join score on stu.StuId=score.StuId) where score is null;

    报错:

    报错:Every derived table must have its own alias

    翻译报错:每个派生表必须有自己的别名。

    解决: 给临时表(派生表)起个别名

    #查询缺考学生信息
    select StuId,StuName from(
    #学生表与成绩表的左连接,可以得到学生信息对应考试表,出现考试信息为null
    select stu.StuId,StuName,Score from stu 
    left join score on stu.StuId=score.StuId) as 考试信息 where score is null;


    8,关键字报错问题:

    保留关键字/非保留关键字:其中保留关键字需要加引号`` (``符号在1旁边哈!)  (宝宝,要睁大眼睛看噢,符号是引号``,    而不是 单引号’’),非保留关键字: 可以直接使用噢!

    保留/非保留 关键字:(查看mysql官网)https://dev.mysql.com/doc/refman/8.0/en/keywords.html

    ps:一般mysql的图像界面工具会提示,当创建表格或者字段时提示错误,可能是使用了保留关键字!

    举例:

    解决:添加反引号``

     9,两张表的共同属性关系是:1对多,(1对多 的外键引用关系不适合用内连接!)

    ----解决:需要起别名,“副表”,另外一张表的作用来区分开。

    内连接需要一张表与另一张表的共同属性是1对1而不是1对多;(1:多只能选择子查询)

    举例子:表结构如下:

    题意:查询显示出结果如下:

     分析:

    内连接查询:

    赛程表(只有队伍编号(分成:主队队伍编号、客队队伍编号))参赛队表(队伍编号对应队伍名称)

    所以两个表需要通过队伍编号关联起来-----外键参赛表的队伍编号是赛程表的主队队伍编号、客队队伍编号的引用外键。

    因为参赛队表(队伍编号对应队伍名称)中的 队伍编号 同时被赛程表(只有队伍编号(分成:主队队伍编号、客队队伍编号))中的 主队编号客队编号 引用作为外键,所以通过队伍编号的把两张表连接到一起,无法统一队伍编号是要与主队编号结合成一组还是和客队编号结合成一组。(1对多 的外键引用关系不适合用内连接!)

    -----------不过通过,给表起别名区分开(实现了一对一),也是可以使用内连接的。

    1、子查询:

    #子连接
    select (select TeamName from Team where Team.TeamId=`Match`.HostTeamId) as '主队',
    MatchResult as '比分',
    (select TeamName from Team where Team.TeamId=`Match`.GustTeamId) as '客队',
    from `Match`;

     2、2-1 起别名实现1对1的内连接:

    #内连接
    select Team.TeamName as '主队',MatchResult as '比分',t.TeamName as '客队',MatchTime as '比赛时间'
    from Team, `Match`, Team as t where Team.TeamId=`Match`.HostTeamId and t.TeamId=`Match`.GustTeamId;        # t 是Team 这张表起的一个别名,有“副表”另外一张表的作用的意思

    2-2 内连接写法2:

    #内连接写法2
    select Team.TeamName as '主队',MatchResult as '比分',t.TeamName as '客队',MatchTime as '比赛时间' from `Match`
    inner join Team on (Team.TeamId=`Match`.HostTeamId)
    inner join Team as t  on (t.TeamId=`Match`.GustTeamId);

     3、内连接跟子查询结合起来使用

    3-1.写法一:

    select Team.TeamName as '主队',MatchResult as '比分',
    (select TeamName from Team where `Match`.GustTeamId=Team.TeamId) as '客队',MatchTime as '比赛时间'
    from Team, `Match` where Team.TeamId=`Match`.HostTeamId;

    3-2.写法二:

    #内连接inner join结合子查询
    select TeamName as '主队',MatchResult as '比分',(select TeamName from Team where Team.TeamId=`Match`.GustTeamId),MatchTime as '比赛时间' from `Match`
    inner join Team on Team.TeamId=`Match`.HostTeamId;



    10,一个表不能有2个主键,因为主键代表数据的物理组织形式,所以不能存在2个。但是允许用多个字段联合组成主键

    Error Code: 1068. Multiple primary key defined  (翻译:重复定义了主键)

    解决:使用(主键组合):

    #解决:使用(主键组合)
    alter table SC add primary key(`Sno`,`Cno`);

     

    学习mysql中遇到的问题以及解决(二):

     

     
  • 相关阅读:
    Fast polling using C, memcached, nginx and libevent
    为什么MongoDB可以替代MySQL?
    comet server 的介绍及方案选型
    多任务服务器架构设计
    基于libev面向分布式数据系统的C10K服务器设计
    libev & libevent简介
    memcached、redis、mysql、mongodb结合架构数据库系统
    删除数组中的重复元素
    不用运算符比较两个int数的大小
    JDBC之简介
  • 原文地址:https://www.cnblogs.com/shan333/p/14683752.html
Copyright © 2011-2022 走看看