栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”

我建议使用

INSERT...ON DUPLICATE KEY UPDATe

如果使用

INSERT IGNORE
,那么如果该行导致重复键,则实际上不会插入该行。但是该语句不会产生错误。而是生成警告。这些情况包括:

  • 在具有
    PRIMARY KEY
    UNIQUE
    约束的列中插入重复的键。
  • 将NULL插入具有
    NOT NULL
    约束的列中。
  • 在分区表中插入一行,但是您插入的值不会映射到分区。

如果使用

REPLACE
,MySQL实际上会在内部执行,
DELETE
然后执行
INSERT
内部操作,这会产生一些意外的副作用:

  • 分配了一个新的自动增量ID。
  • 带有外键的相关行可能会被删除(如果您使用级联外键),否则可能会阻止
    REPLACE
  • 触发的触发器
    DELETE
    不需要执行。
  • 副作用也传播到副本。

修正:

REPLACE
INSERT...ON DUPLICATE KEY UPDATE
是非标准的,私有的发明具体到MySQL。ANSI
SQL 2003定义了
MERGE
可以满足相同需求(甚至更多)的
MERGE
语句,但是MySQL不支持该语句。


一位用户尝试编辑此帖子(主持人拒绝了该编辑)。修改尝试添加一个声明,该声明

INSERT...ON DUPLICATE KEYUPDATE
导致分配了新的自动递增ID。确实会 生成 新的id ,但是更改后的行中不会使用它。

请参见下面的演示,该演示已通过Percona Server 5.5.28测试。配置变量

innodb_autoinc_lock_mode=1
(默认):

mysql> create table foo (id serial primary key, u int, unique key (u));mysql> insert into foo (u) values (10);mysql> select * from foo;+----+------+| id | u    |+----+------+|  1 |   10 |+----+------+mysql> show create table fooGCREATE TABLE `foo` (  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  `u` int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `u` (`u`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1mysql> insert into foo (u) values (10) on duplicate key update u = 20;mysql> select * from foo;+----+------+| id | u    |+----+------+|  1 |   20 |+----+------+mysql> show create table fooGCREATE TABLE `foo` (  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  `u` int(11) DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `u` (`u`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

上面的示例表明IODKU语句检测到重复项,并调用更新以更改的值

u
。请注意,
AUTO_INCREMENT=3
表示已生成ID,但未在行中使用。

REPLACe
确实会删除原始行并插入新行,从而生成 存储新的自动增量ID:

mysql> select * from foo;+----+------+| id | u    |+----+------+|  1 |   20 |+----+------+mysql> replace into foo (u) values (20);mysql> select * from foo;+----+------+| id | u    |+----+------+|  3 |   20 |+----+------+


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/368444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号