mysql:4个字段组成的序列,该序列唯一

十八道胡同 2020-09-08 06:26:50
 
insert into etcvehiclerecord(userId,vehicleId,obuid,cardid)
select distinct o.userId , o.vehicleId ,o.id obuid ,c.id cardid from
obuupload o
left JOIN cardupload c ON o.vehicleId = c.vehicleId and o.userId =c.userId
left JOIN vehicleupload v ON o.vehicleId = v.id and o.userId =v.userId;


3个表,组合查询,查询出来4个字段,该4个字段组成序列唯一,其中某个字段因为可能为NULL,所以这4个字段无法组成联合索引。
历史的数据,可以用这个脚本查出来。但是增量的数据怎么增加呢?


一种办法,就是代码的方式,先把所有的序列查出来,然后挨个判断4字段序列。
如果新的序列是4个字段全部为非空,且表里面没有则新增。
如果新的序列是4个字段全部为非空,但表里面有一个序列某字段为空的。把之前的存在某字段为空的序列删掉,把新的4序列入库。
如果新的序列是4个字段,部分字段为空(是新办的),直接入库。
但是这个比较麻烦,想问下大家有没有直接用sql脚本的方式来做?
...全文
286 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
evanweng 2020-09-09
  • 打赏
  • 举报
回复
之所以用concat_ws不用concat是因为concat如果有一个值是null,则整个结果都是null,concat_ws就没有这种情况。然后concat_ws中的字段,如果不想去修改表中的null为空字符串,可以每个字段都加ifnull(user_id,''),就是执行可能会慢一点
evanweng 2020-09-09
  • 打赏
  • 举报
回复
insert into etcvehiclerecord(userId,vehicleId,obuid,cardid) select distinct o.userId , o.vehicleId ,o.id obuid ,c.id cardid from obuupload o left JOIN cardupload c ON o.vehicleId = c.vehicleId and o.userId =c.userId left JOIN vehicleupload v ON o.vehicleId = v.id and o.userId =v.userId where not exists ( select 1 from etcvehiclerecord e where concat_ws(',',e.userId,e.vehicleId,e.obuid,e.cardid) = concat_ws(',',o.userId , o.vehicleId ,o.id obuid ,c.id cardid) ) concat_ws里面的字段,如果是空值,要用空字符串表示,不能用null,不然可能会有错误。例如concat_ws(',','1',null,'2')='1,2',concat_ws(',','1','','2')='1,,2',然后你这个insert ignore into也要看看有没有空值的问题
十八道胡同 2020-09-09
  • 打赏
  • 举报
回复
换了一下思路。 把这4个序列弄成主键 ,以后更新时用insert ignore into 的方式来了。

57,062

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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