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

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/libin6505/p/11390327.html
Copyright © 2011-2022 走看看