关于批量插入前的校验问题

yjsl__ 2018-04-01 12:01:03
多对多关系中,在第三张表中记录关系,使用了自增主键[实际应当是两个涉及的外键作为主键],且不能重复
现在对这张表进行批量插入,但前提是已经在表里有的数据不希望写入进去
因为判断表里有没有数据需要查数据库,又是批量的原因,需要在for循环里查,
代码大概如下
for(){
根据2个外键查一条记录
if(xxx==null)
往数据库库中写入

}
这样子性能会不会很低,用的是mybatis,有更好的解决办法没?
...全文
816 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
诺丽果 2018-04-03
  • 打赏
  • 举报
回复
引用 6 楼 yjsl__ 的回复:
[quote=引用 1 楼 weixin_39309867 的回复:]
某英语老师查看自己的学生列表 学生A 相关操作 学生B 相关操作 学生C 相关操作 当点击新增多个学生的时候,弹出对话框,这个时候还是查学生表,仍然可以勾选学生A,学生B,学生C select * from 学生表 where id not in ()[/quote]对,当新增学生的时候,每个学生前面都有一个checkbox,已经选过的学生前面的checkbox就是处于勾选状态,可以用insertOrUpdate语句
xwn_2016 2018-04-02
  • 打赏
  • 举报
回复
两个外键建立唯一索引,然后用insertOrUpdate语句
诺丽果 2018-04-02
  • 打赏
  • 举报
回复
还有就是可以写一个存储过程,这样调用一次数据库就行,然后数据库会自己执行,还有楼上说的用insertOrUpdate也可以
maradona1984 2018-04-02
  • 打赏
  • 举报
回复
这个没必要多次查询吧,首先插入的集合自检,是否有重复,去掉重复的,然后把集合作为参数,在mybatis里循环拼出条件select * from table ((k1=xxx and k2 = xxx) or (k1=yyyand k2 = yyy) ...) 返回值为重复的数据,去掉该部分集合,剩下的就是不重复的,批量插入即可,你只需要操作数据库两次 如果中间表的主键没有别的地方用到,也可以先批量插入,再删除重复数据即可(删除重复数据的sql随便可以找到),代码更少
诺丽果 2018-04-02
  • 打赏
  • 举报
回复
性能是会低,我感觉这是设计思路的问题,你说“在第三张表中记录关系,使用了自增主键[实际应当是两个涉及的外键作为主键],且不能重复”,先说新建一个关系的时候,在页面肯定有显示,哪些是已经关联过的关系,一定是这两个外键的其中之一作为主要的,两个是一对多的关系,就比如说一个英语老师有好多学生,那关系表中应该是[英语老师,学生A],[英语老师,学生B],[英语老师,学生C],这才是关系表中的数据,当你新建关系的时候,页面一定会显示出来英语老师手底下有哪些个学生了,可以修改,可以增加啊,你可以在设计的时候就能避开可能产生的重复问题。但是如果不该设计的,说实话,我能想到的避开重复插入的方法跟你差不多,也是用for()循环,先判断一下数据库中有没有,如果没有加入一个新的list中,最后for循环结束以后,使用批量插入
yjsl__ 2018-04-02
  • 打赏
  • 举报
回复
引用 1 楼 weixin_39309867 的回复:
某英语老师查看自己的学生列表 学生A 相关操作 学生B 相关操作 学生C 相关操作 当点击新增多个学生的时候,弹出对话框,这个时候还是查学生表,仍然可以勾选学生A,学生B,学生C select * from 学生表 where id not in ()
  • 打赏
  • 举报
回复
可以给不能重复的字段加上唯一索引,这样就不会重复插入。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧