如何避免Duplicate key在数据表插入中的应用

发布时间:2021-10-25 10:37:41 作者:柒染
来源:亿速云 阅读:183

这期内容当中小编将会给大家带来有关如何避免Duplicate key在数据表插入中的应用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

       在一个数据表中插入数据,防止有重复的数据插入,一般DBA大多的做法是

唯一索引,主键,在重复的数据插入的过程中,就通过数据库的唯一约束或检查,将这些重复的数据拒之门外。

       而很多场合下,这样的作法并不合适,因为你遇到的程序员他可能不大会处理在数据拒绝插入的后续处理,这是比较尴尬的问题。如何能让他用很简单的SQL语句,来将这个问题解决,这需要 DBA 做点什么。

在SQL SERVER 中一般的情况是这样使用的,(看下面的语句),通过在插入的过程中,进行判断,判断插入tbl_A 来自于 tbl_B的数据不应该和 tbl_A重复,也就是在插入的前边要来一次机遇标识键的过滤

INSERT tbl_A (col, col2)   SELECT col, col2   FROM tbl_B   WHERE NOT EXISTS (SELECT col FROM tbl_A A2 WHERE A2.col = tbl_B.col);

这样看着比较LOW 其实效率也一般。 所以微软推荐的方法是下面的

 Merge 功能,这个功能的在我工作的十几年的经历中,是比较少的,因为大多数的场景在现在的应用开发中,CRUD 的操作已经能覆盖大部分数据库操作的功能,大部分的计算和判断的功能大多是在应用层来做的,通过程序来实践,数据库越来越多变得像一个容器被使用,数据库只要做好MVCC,ISOLATE的事情就OK 了, 所以MERGE 的功能比较少的被引用到数据库的使用中。

而何时要使用MERGE 功能,最近的一个项目的修改中,就遇到了,在原先的数据插入,使用了游标,这样的结果可想而知,一定是糟糕的,数据库使用游标本来就是下下的选择,如果一个程序员使用了游标,除非数据量很小,并且逻辑非常复杂,而且必须要用数据库 PROCEDURE 来做,否则游标应该被踢出数据库的语句层。

在修改后的存储过程中,已经没有了游标,这是一个可喜的事情,但不好的事情又发生了,程序的逻辑中,需要判断插入的数据是否已经在数据库中存在,如果存在,就不要插入,否则就插入。

当然要解决这个问题,其实方法很多,相应的每种方法的限制也不少。

1  唯一索引,联合唯一索引 (被回绝,顾问提供的存储过程是不会使用这样的方法来处理那些中断,错误,使用这样的方法还是要程序报错,目的没有达到) PASS

2  insert into  ....... select ......  where not exist (select .... ) 这个就不说了,上面已经有这样的语句了

3 本次的重点,merge into 语句, 我们还拿上面的的语句改写成merge into 来实现。INSERT tbl_A (col, col2)   SELECT col, col2   FROM tbl_B   WHERE NOT EXISTS (SELECT col FROM tbl_A A2 WHERE A2.col = tbl_B.col);

如何避免Duplicate key在数据表插入中的应用

改写后,

merge into tab1 as tab1 

using (select id,size_2 from tab2) as tab2  on tab1.id_1 = tab2.id  

WHEN NOT MATCHED THEN 

insert (size_1) values (size_2);

结果:在没有报错的情况下,将两个表重合的记录去除后,在将不同的结果插入。

如何避免Duplicate key在数据表插入中的应用

问题解决

MYSQL

在MYSQL 中,处理这样的事情比SQL SERVER的方法要多,主要有两种

1 REPLACE INTO

2 DUPLICATE KEY UPDATE

以上两种方法,在这样的情况下,使用 DUPLICATE KEY UPDATE 是比较合适的,具体Replace into

这里就不在介绍,这两个区别也是显而易见的,一个 匹配 DELETE  ,在INSERT ,另一个是 匹配UPDATE

这是明显的两个方式的不同。

这里还是MYSQL的两个类似SQL SERVER 表

如何避免Duplicate key在数据表插入中的应用如何避免Duplicate key在数据表插入中的应用

还是要将 tab2 的与 tab1 不同的数据插入到 tab1

insert into tab1 (id,name) select id,name_2 from tab2 on duplicate key update  tab1.name= tab2.name_2;

以上的一条语句就可以完成这个工作,根据主键或者唯一索引,来判断重复的数据,并紧紧进行更新,否则就插入tab1中在tab2中不存在的数据。

如何避免Duplicate key在数据表插入中的应用

对比 SQL SERVER , MySQL在这项工作中显然是要方便的多。

——————————————————————————————

如何避免Duplicate key在数据表插入中的应用

ORACLE  在处理这样数据的方式和SQL SERVER 类似,

merge into tab1 using tab2 on (tab1.id=tab2.id) when not matched then insert (id,name) values (tab2.id,tab2.name_2);

如何避免Duplicate key在数据表插入中的应用

_____________________________________________________________

如何避免Duplicate key在数据表插入中的应用

Postgresql 简述: Postgresql 的确是数据库界的黑马,无论是MYSQL的 

 duplicate key update ,还是 ORACLE  SQL SERVER 支持的 MERGE INTO 语法均在数据库中支持(11版本)

——————————————————————————————————总结:

相比MYSQL ,SQL SERVER 和ORACLE 在处理重复值上比较麻烦,虽然SQL SERVER 和ORACLE 在处理的路数上近似一致,但也有不同点,PostgreSQL 的确是后来者居上,三种数据库支持的方式均在最新版的数据库中支持

如何避免Duplicate key在数据表插入中的应用

1 ORACLE 胜出,在MATCH 下的语句还是可以添加 where 条件,这样操作会更灵活,SQL SERVER 不可以

如何避免Duplicate key在数据表插入中的应用

2 SQL SERVER 胜出, SQL SERVER 可以在判断中,将目标表未操作的数据删除,但ORACLE 不可以

如何避免Duplicate key在数据表插入中的应用

3 MYSQL 在使用中针对去重记录,是最简便最快速的,但功能简单,如果要进行ORACLE 或者 SQL SERVER 复杂的功能,则没有现成的语句完成。

如何避免Duplicate key在数据表插入中的应用

4  PostgreSQL,胜出,三种数据库支持的方法均都支持,缺点,需要更新的 11版本的PostgreSQL.

上述就是小编为大家分享的如何避免Duplicate key在数据表插入中的应用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 当删库时如何避免跑路
  2. mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:String长度的限制是多少

下一篇:Python爬虫经常会被封的原因是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》