[数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用

本文深入解析MySQL中四种数据插入方式:INSERT INTO、INSERT IGNORE INTO、REPLACE INTO与ON DUPLICATE KEY UPDATE的区别及应用场景,通过实例演示如何高效处理数据冲突。

mysql插入一条数据方式有四种,接下来逐个说明验证:

前提:

有一个表,作为本次测试:

CREATE TABLE `zs_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_id_index` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

表名是zs_test;
包括主键id,唯一索引order_id和普通列name;

INSERT INTO

最普通,最常用的插入是:
INSERT INTO zs_test (id,name,order_id) VALUES (1,‘aa’,11);
此时库中有了一条数据,id=1;name=‘aa’;order_id=11

idnameorder_id
1aa11

INSERT IGNORE INTO

  • 1.用这个插入一条,主键和唯一索引都是新的:

INSERT IGNORE INTO zs_test (id,name,order_id) VALUES (2,‘bb’,12);
也成功,受影响的行数是1,此时库中有两条数据,

idnameorder_id
1aa11
2bb12
当本次要插入的主键id和唯一索引order_id在库中都没有重复时,INSERT IGNORE INTO相当于INSERT INTO;
  • 2.再插入一条,主键用了1,库中已存在的:

INSERT IGNORE INTO zs_test (id,name,order_id) VALUES (1,‘bb’,13);
没有报错,受影响的行数是0,但是数据库中的数据没有变化,

idnameorder_id
1aa11
2bb12
  • 3.再插入一条,唯一索引用了11,库中已存在的:

INSERT IGNORE INTO zs_test (id,name,order_id) VALUES (3,‘bb’,11);
没有报错,受影响的行数是0,但是数据库中的数据没有变化,

idnameorder_id
1aa11
2bb12
当本次要插入的主键id或者唯一索引order_id在库中有任何一个重复时,INSERT IGNORE INTO相当于不执行任何操作;

REPLACE INTO

  • 1.用这个插入一条,主键和唯一索引都是新的:

REPLACE INTO zs_test (id,name,order_id) VALUES (3,‘cc’,13);
也成功,受影响的行数是1,此时库中有三条数据,

idnameorder_id
1aa11
2bb12
3cc13
当本次要插入的主键id和唯一索引order_id在库中都没有重复时,REPLACE INTO相当于INSERT INTO;
  • 2.再插入一条,主键用了1,库中已存在的:

REPLACE INTO zs_test (id,name,order_id) VALUES (1,‘bb’,14);
执行成功,受影响的行数是2,此时库中有三条数据,但是主键为1的那条数据,他的order_id变成了14,name也变成bb

idnameorder_id
1bb14
2bb12
3cc13
当本次要插入的主键id和唯一索引order_id在库中有任何一个重复时,REPLACE INTO相当于先删除原数据,再INSERT INTO本条数据,所以受影响行数是2;

ON DUPLICATE KEY UPDATE

  • 1.用这个插入一条,主键和唯一索引都是新的:
    INSERT INTO zs_test (id,name,order_id) VALUES (5,‘aa’,15) ON DUPLICATE KEY UPDATE name=‘aabb’;
    成功,受影响的行数是1,此时库中有四条数据,
idnameorder_id
1bb14
2bb12
3cc13
5aa15
当本次要插入的主键id和唯一索引order_id在库中都没有重复时,ON DUPLICATE KEY UPDATE后面的部分相当于没写,只是简单的前面INSERT INTO的效果;
  • 2.再插入一条,主键用了1,库中已存在的,唯一索引随意:
    INSERT INTO zs_test (id,name,order_id) VALUES (1,‘aa’,12) ON DUPLICATE KEY UPDATE name=‘aabb’;
    成功,受影响的行数是2,此时库中有四条数据,但主键为1的那条数据的name值变成了aabb
idnameorder_id
1aabb14
2bb12
3cc13
5aa15
当本次要插入的主键id库中有重复时,ON DUPLICATE KEY UPDATE相当于不改变数据,将后面update的值做修改;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值