• 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: 4  Duplicates: 1  Warnings: 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: 4  Duplicates: 4  Warnings: 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: 4  Duplicates: 1  Warnings: 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: 4  Duplicates: 1  Warnings: 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) 

    注:

    INSERT 中ON DUPLICATE KEY UPDATE的使用(本文重点)

    如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

    Sql代码  收藏代码
    1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;  
    2. mysql>UPDATE table SET c=c+1 WHERE a=1;  

    如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

    注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

    Sql代码  收藏代码
    1. mysql>UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;  

    如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

    您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。

    示例:

    Sql代码  收藏代码
    1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  
    2.           ->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);  

    本语句与以下两个语句作用相同:

    Sql代码  收藏代码
    1. mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)  
    2.           ->ON DUPLICATE KEY UPDATE c=3;  
    3. mysql>INSERT INTO table (a,b,c) VALUES (4,5,6)  
    4.           ->ON DUPLICATE KEY UPDATE c=9;  

    当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略

  • 相关阅读:
    mysql索引
    struts升级2.3.12到2.5.13
    springboot使用servlet
    springboot拦截器
    开发复制内容
    Linux常用命令
    Eclipse中文语言包安装和设置中文
    eclipse编写代码所遇到的问题
    permission denied (publickey)问题的解决和向github添加ssh key
    工具
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/6762371.html
Copyright © 2020-2023  润新知