阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1322|回复: 1

[转帖] MYSQL插入处理重复键值的几种方法

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-2-7 16:12:24 | 显示全部楼层 |阅读模式
    当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。



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

    mysql> create table test1(id int,name varchar(5),type int,primary key(id));

    Query OK, 0 rows affected (0.01 sec)



    mysql> create table test2(id int,name varchar(5),type int,primary key(id));

    Query OK, 0 rows affected (0.01 sec)





    mysql> select * from test1;

    +-----+------+------+

    | id| name | type |

    +-----+------+------+

    | 101 | aaa|  1 |

    | 102 | bbb|  2 |

    | 103 | ccc|  3 |

    +-----+------+------+

    3 rows in set (0.00 sec)



    mysql> select * from test2;

    +-----+------+------+

    | id| name | type |

    +-----+------+------+

    | 201 | aaa|  1 |

    | 202 | bbb|  2 |

    | 203 | ccc|  3 |

    | 101 | xxx|  5 |

    +-----+------+------+

    4 rows in set (0.00 sec)



    1、REPLACE INTO

    发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。

    mysql> replace into test1(id,name)(select id,name from test2);

    Query OK, 5 rows affected (0.04 sec)

    Records: 4Duplicates: 1Warnings: 0



    mysql> select * from test1;

    +-----+------+------+

    | id| name | type |

    +-----+------+------+

    | 101 | xxx| NULL |

    | 102 | bbb|  2 |

    | 103 | ccc|  3 |

    | 201 | aaa| NULL |

    | 202 | bbb| NULL |

    | 203 | ccc| NULL |

    +-----+------+------+

    6 rows in set (0.00 sec)



    需要注意的是,当你replace的时候,如果被插入的表如果没有指定列,会用NULL表示,而不是这个表原来的内容。如果插入的内容列和被插入的表列一样,则不会出现NULL。例如

    mysql> replace into test1(id,name,type)(select id,name,type from test2);

    Query OK, 8 rows affected (0.04 sec)

    Records: 4Duplicates: 4Warnings: 0



    mysql> select * from test1;

    +-----+------+------+

    | id| name | type |

    +-----+------+------+

    | 101 | xxx|  5 |

    | 102 | bbb|  2 |

    | 103 | ccc|  3 |

    | 201 | aaa|  1 |

    | 202 | bbb|  2 |

    | 203 | ccc|  3 |

    +-----+------+------+

    6 rows in set (0.00 sec)



    如果INSERT的时候,需要保留被插入表的列,只更新指定列,那么就可以使用第二种方法。



    2、INSERT INTO ON DUPLICATE KEY UPDATE

    发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。例如我只想插入test2表的id,name字段,但是要保留test1表的type字段:

    mysql> insert into test1(id,name,type)(select id,name,type from test2) on DUPLICATE KEY UPDATE test1.name=test2.name;

    Query OK, 5 rows affected (0.04 sec)

    Records: 4Duplicates: 1Warnings: 0



    mysql> select * from test1;

    +-----+------+------+

    | id| name | type |

    +-----+------+------+

    | 101 | xxx|  1 |

    | 102 | bbb|  2 |

    | 103 | ccc|  3 |

    | 203 | ccc|  3 |

    | 202 | bbb|  2 |

    | 201 | aaa|  1 |

    +-----+------+------+

    6 rows in set (0.00 sec)



    如果INSERT的时候,只想插入原表没有的数据,那么可以使用第三种方法。



    3、IGNORE INTO

    判断是否存在,存在不插入,否则插入。很容易理解,当插入的时候,违反唯一性约束,MySQL不会尝试去执行这条语句。例如:

    mysql> insert ignore into test1(id,name,type)(select id,name,type from test2);

    Query OK, 3 rows affected (0.01 sec)

    Records: 4Duplicates: 1Warnings: 0



    mysql> select * from test1;

    +-----+------+------+

    | id| name | type |

    +-----+------+------+

    | 101 | aaa|  1 |

    | 102 | bbb|  2 |

    | 103 | ccc|  3 |

    | 203 | ccc|  3 |

    | 202 | bbb|  2 |

    | 201 | aaa|  1 |

    +-----+------+------+

    6 rows in set (0.00 sec)
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    奋斗
    2014-7-5 09:12
  • 签到天数: 276 天

    [LV.8]以坛为家I

    发表于 2012-2-16 00:31:41 | 显示全部楼层
    谢谢楼主 本文来自:阳光网驿_企业信息化专家
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表