zoukankan      html  css  js  c++  java
  • mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转:

    mysql insert时几个操作DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE的区别

    zccst整理

    一、DELAYED的使用

    使用延迟插入操作

    DELAYED调节符应用于INSERT和REPLACE语句。当DELAYED插入操作到达的时候,服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户端就可以在数据表被真正地插入记录之前继续进行操作了。如果读取者从该数据表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器开始插入延迟数据行(delayed-row)队列中的数据行。在插入操作的同时,服务器还要检查是否有新的读取请求到达和等待。如果有,延迟数据行队列就被挂起,允许读取者继续操作。当没有读取者的时候,服务器再次开始插入延迟的数据行。这个过程一直进行,直到队列空了为止。

    几点要注意事项:
    · INSERT DELAYED应该仅用于指定值清单的INSERT语句。服务器忽略用于INSERT DELAYED...SELECT语句的DELAYED。
    · 服务器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE语句的DELAYED。
    · 因为在行被插入前,语句立刻返回,所以您不能使用LAST_INSERT_ID()来获取AUTO_INCREMENT值。AUTO_INCREMENT值可能由语句生成。
    · 对于SELECT语句,DELAYED行不可见,直到这些行确实被插入了为止。
    · DELAYED在从属复制服务器中被忽略了,因为DELAYED不会在从属服务器中产生与主服务器不一样的数据。

    注意,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,如果您强行中止了mysqld(例如,使用kill -9)或者如果mysqld意外停止,则所有没有被写入磁盘的行都会丢失。



    二、IGNORE的使用

    IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTER TABLE的运行。如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。并且,对错误值进行修正,使之尽量接近正确值。

    insert ignore into tb(...) value(...)

    这样不用校验是否存在了,有则忽略,无则添加



    三、ON DUPLICATE KEY UPDATE的使用
    MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDATE语法,使得原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成。

    例如ipstats表结构如下:
    引用
    CREATE TABLE ipstats (
      ip VARCHAR(15) NOT NULL UNIQUE,
      clicks SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0'
    );

    原本需要执行3条SQL语句,如下:

    IF (SELECT * FROM ipstats WHERE ip='192.168.0.1') {
    UPDATE ipstats SET clicks=clicks+1 WHERE ip='192.168.0.1';
    } else {
    INSERT INTO ipstats (ip, clicks) VALUES ('192.168.0.1', 1);
    }

    而现在只需下面1条SQL语句即可完成:

    INSERT INTO ipstats VALUES('192.168.0.1', 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

    注意,要使用这条语句,前提条件是这个表必须有一个唯一索引或主键。

    mysql> create table i (id int unique, co int);
    mysql> insert into i values (1,1),(2,1);
    mysql> insert into i values (1,1) on duplicate key update co=co+1;
    mysql> select * from i;
    +------+------+
    | id   | co    |
    +------+------+
    |    1 |    2 |
    |    2 |    1 |
    +------+------+

    //如果再执行一次insert into i values (1,1) on duplicate key update co=co+1;则结果为:
    mysql> select * from i;
    +------+------+
    | id   | co    |
    +------+------+
    |    1 |    3 |
    |    2 |    1 |
    +------+------+

    //经测试,id为主键时也可行,与unique时一样
    create table i (id int auto_increment primary key, co int);

    四、三者之间区别
    DELAYED   做为快速插入,并不是很关心失效性,提高插入性能。

    ignore    只关注主键对应记录是不存在,无则添加,有则忽略。

    ON DUPLICATE KEY UPDATE 在添加时操作,关注非主键列,注意与ignore的区别。有则更新指定列,无则添加。

    ----------------------

    转:

    MySQL中的insert ignore into, replace into等的一些用法总结

    MySQL replace into 有三种形式:

    1. replace into tbl_name(col_name, ...) values(...)

    2. replace into tbl_name(col_name, ...) select ...

    3. replace into tbl_name set col_name=value, ...

    1.insert ignore into

    当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:

    INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')

    2.on duplicate key update

    当primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。例如,为了实现name重复的数据插入不报错,可使用一下语句:

    INSERT INTO books (name) VALUES ('MySQL Manual') ON duplicate KEY UPDATE id = id

    3.insert … select … where not exist

    根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

    INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

    4.replace into

    如果存在primary or unique相同的记录,则先删除掉。再插入新记录。

    REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

  • 相关阅读:
    SPARK 中 DriverMemory和ExecutorMemory
    Logistic Regression vs Decision Trees vs SVM: Part II
    Logistic Regression Vs Decision Trees Vs SVM: Part I
    Scala _ [underscore] magic
    spark-shell --conf
    spark-submit [options]
    maven 将依赖的jar包打入jar包中
    log4j
    eclipse java工程和maven工程的互相转换
    插件上传2
  • 原文地址:https://www.cnblogs.com/libin6505/p/11390327.html
Copyright © 2011-2022 走看看