MySQL-复杂SQL语句记录

x33g5p2x  于2021-11-24 转载在 Mysql  
字(1.0k)|赞(0)|评价(0)|浏览(439)

数据去重

单表插入时候单例去重

这种方式是使用mysql自带的语法但是这种方式必须保证需要去重的列是主键或者唯一索引(这样基本百分之50的场景就不能使用了,因为很多场景都是多例同时满足才算重复,允许单例重复的)

插入时候如果发现是重复的,那么删除原来的保留新的

replace  INTO `ip_pool_new` ( `ip`, `type`, `score`) 
VALUES (1, 1, 10);

插入时候如果发现是重复的,那么修改原来的数据
场景: 若数据表中存在相同主键的记录,我们就更新该条记录。

单条

INSERT INTO mRowUpdate(id,`value`) VALUES(3, 'SuperMan') ON DUPLICATE KEY UPDATE `value`='SuperMan';

多条

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

不能使用这种方式的几个条件(否则会发生未知问题):

  1. 唯一列大于1 (主键,唯一索引)
  2. 在有可能有并发事务执行的insert 语句情况下不使用该语句,可能导致产生(死锁)。
  3. 如果数据表id是自动递增的不建议使用该语句;id不连续,如果前面更新的比较多,新增的下一条会相应跳跃的更大。(看情况吧)

插入时候如果发现是有重复的,那么跳过

INSERT ignore  INTO `ip_pool_new` ( id,`ip`, `type`) 
VALUES (1,1, 1),(14, 1, 10);

单表多例去重

下语句去重 (ip=1 and port=1)

delete from ip_pool_new where id in(
SELECT a.id from (select a.id FROM (select id from ip_pool_new where ip=1 and port=1) as a 
where a.id<>(select id from ip_pool_new where ip=1 and port=1  LIMIT 1  )) as a
)

这里我多套了一层派生表不然会出现1093 - You can’t specify target table ‘ip_pool_new’ for update in FROM clause错误意思是不能自己操作自己

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

相关文章

最新文章

更多