mysql临时表
2017-03-01 23:20
169 查看
1、 在我们的项目中,往往可能会有这么一个需求:比如老师给学生选课,前台页面老师勾选了n个学生,给他们选语文课,这时有的学生已经选过语文课了,我们向后台传递这些学生的信息和语文课信息。一般初学者,会在后端业务层新增是判断勾选的学生是否选了语文课,如果选择了,则不去新增。
其实,我们通过mysql的语句关键词ignore,则不需要业务层判断,举例说明如下:
首先,我们有个user表,字段有id、name,此表已有数据,如下图:
![](http://img.blog.csdn.net/20170301234251443?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ0NTg2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
当我们使用下面sql语句
![](http://img.blog.csdn.net/20170301234542959?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ0NTg2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
结果应为重复数据,报错了。
那我们看下面sql语句,结果如下:
![](http://img.blog.csdn.net/20170301235010031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ0NTg2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
结论:当我们为了避免重复是,sql中可以使用ingnre关键词,来达到简化业务层代码的目的
2、 关于临时表,借用别人的例子,如下:
给定一个user表,包含id和uid两列,其中uid列可能有重复,要求找出重复的记录,并删掉多余的记录,使得对于uid重复的记录只保留id最小的记录
drop table if EXISTS `tmp`;
create table tmp as select min(id) as id,uid from user GROUP by uid HAVING count(uid)>1;
delete from user where id not in (select id from tmp) and uid in(select uid from tmp);
drop table tmp;
commit;
其实,我们通过mysql的语句关键词ignore,则不需要业务层判断,举例说明如下:
首先,我们有个user表,字段有id、name,此表已有数据,如下图:
当我们使用下面sql语句
结果应为重复数据,报错了。
那我们看下面sql语句,结果如下:
结论:当我们为了避免重复是,sql中可以使用ingnre关键词,来达到简化业务层代码的目的
2、 关于临时表,借用别人的例子,如下:
给定一个user表,包含id和uid两列,其中uid列可能有重复,要求找出重复的记录,并删掉多余的记录,使得对于uid重复的记录只保留id最小的记录
drop table if EXISTS `tmp`;
create table tmp as select min(id) as id,uid from user GROUP by uid HAVING count(uid)>1;
delete from user where id not in (select id from tmp) and uid in(select uid from tmp);
drop table tmp;
commit;