加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱资讯网 (https://www.52junxun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL插入处理重复键值的几种方法

发布时间:2022-11-09 10:57:46 所属栏目:MySql教程 来源:
导读:  当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。

  先建立2个测试表,在id列上创建unique约束。

  mysql>create
  当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。
 
  先建立2个测试表,在id列上创建unique约束。
 
  mysql>createtabletest1(idint,namevarchar(5),typeint,primarykey(id));
 
  QueryOK,0rowsaffected(0.01sec)
 
  mysql>createtabletest2(idint,namevarchar(5),typeint,primarykey(id));
 
  QueryOK,0rowsaffected(0.01sec)
 
  mysql>select*fromtest1;
 
  +-----+------+------+
 
  |id|name|type|
 
  +-----+------+------+
 
  |101|aaa|1|
 
  |102|bbb|2|
 
  |103|ccc|3|
 
  +-----+------+------+
 
  3rowsinset(0.00sec)
 
  mysql>select*fromtest2;
 
  +-----+------+------+
 
  |id|name|type|
 
  +-----+------+------+
 
  |201|aaa|1|
 
  |202|bbb|2|
 
  |203|ccc|3|
 
  |101|xxx|5|
 
  +-----+------+------+
 
  4rowsinset(0.00sec)
 
  1、REPLACEINTO
 
  发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。
 
  mysql>replaceintotest1(id,name)(selectid,namefromtest2);
 
  QueryOK,5rowsaffected(0.04sec)
 
  Records:4Duplicates:1Warnings:0
 
  mysql>select*fromtest1;
 
  +-----+------+------+
 
  |id|name|type|
 
  +-----+------+------+
 
  |101|xxx|NULL|
 
  |102|bbb|2|
 
  |103|ccc|3|
 
  |201|aaa|NULL|
 
  |202|bbb|NULL|
 
  |203|ccc|NULL|
 
  +-----+------+------+
 
  6rowsinset(0.00sec)
 
  需要注意的是,当你replace的时候,如果被插入的表如果没有指定列,会用NULL表示,而不是这个表原来的内容。如果插入的内容列和被插入的表列一样MySQL 处理重复数据,则不会出现NULL。例如
 
  mysql>replaceintotest1(id,name,type)(selectid,name,typefromtest2);
 
  QueryOK,8rowsaffected(0.04sec)
 
  Records:4Duplicates:4Warnings:0
 
  mysql>select*fromtest1;
 
  +-----+------+------+
 
  |id|name|type|
 
  +-----+------+------+
 
  |101|xxx|5|
 
  |102|bbb|2|
 
  |103|ccc|3|
 
  |201|aaa|1|
 
  |202|bbb|2|
 
  |203|ccc|3|
 
  +-----+------+------+
 
  6rowsinset(0.00sec)
 
  如果INSERT的时候,需要保留被插入表的列,只更新指定列,那么就可以使用第二种方法。
 
  2、INSERTINTOONDUPLICATEKEYUPDATE
 
  发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。例如我只想插入test2表的id,name字段,但是要保留test1表的type字段:
 
  mysql>insertintotest1(id,name,type)(selectid,name,typefromtest2)onDUPLICATEKEYUPDATEtest1.name=test2.name;
 
  QueryOK,5rowsaffected(0.04sec)
 
  Records:4Duplicates:1Warnings:0
 
  mysql>select*fromtest1;
 
  +-----+------+------+
 
  |id|name|type|
 
  +-----+------+------+
 
  |101|xxx|1|
 
  |102|bbb|2|
 
  |103|ccc|3|
 
  |203|ccc|3|
 
  |202|bbb|2|
 
  |201|aaa|1|
 
  +-----+------+------+
 
  6rowsinset(0.00sec)
 
  如果INSERT的时候,只想插入原表没有的数据,那么可以使用第三种方法。
 
  3、IGNOREINTO
 
  判断是否存在,存在不插入,否则插入。很容易理解,当插入的时候,违反唯一性约束,MySQL不会尝试去执行这条语句。例如:
 
  mysql>insertignoreintotest1(id,name,type)(selectid,name,typefromtest2);
 
  QueryOK,3rowsaffected(0.01sec)
 
  Records:4Duplicates:1Warnings:0
 
  mysql>select*fromtest1;
 
  +-----+------+------+
 
  |id|name|type|
 
  +-----+------+------+
 
  |101|aaa|1|
 
  |102|bbb|2|
 
  |103|ccc|3|
 
  |203|ccc|3|
 
  |202|bbb|2|
 
  |201|aaa|1|
 
  +-----+------+------+
 
  6rowsinset(0.00sec)
 

(编辑:我爱资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!