程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY updatE”?

开发过程中遇到“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY updatE”的问题如何解决?下面主要结合日常开发的经验,给出你关于“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY updatE”的解决方法建议,希望对你解决“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY updatE”有所启发或帮助;

我建议使用INSERT...oN DUPliCATE KEY updatE

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

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

如果使用replaCE,MysqL实际上会在内部执行,deletE然后执行INSERT内部操作,这会产生一些意外的副作用:

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

replaCEINSERT...oN DUPliCATE KEY updatE是非标准的,私有的发明具体到MysqL。ANSI sql 2003定义了@H_999_3@mERGE可以满足相同需求(甚至更多)的@H_999_3@mERGE语句,但是MysqL不支持该语句

一位用户尝试编辑此帖子(主持人拒绝了该编辑)。修改尝试添加一个声明,该声明INSERT...oN DUPliCATE KEY updatE导致分配了新的自动递增ID。确实会 生成 新的ID ,但是更改后的行中不会使用它。

请参见下面的演示,该演示已通过Percona Server 5.5.28测试。配置变量innodb_autoinc_lock_mode=1(默认):

@H_999_3@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 foo\G
create 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=laTin1

MysqL> insert into foo (u) values (10) on duplicate key update u = 20;
MysqL> SELEct * from foo;
+----+------+
| ID | u    |
+----+------+
|  1 |   20 |
+----+------+

MysqL> show create table foo\G
create 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:

@H_999_3@mysqL> SELEct * from foo;
+----+------+
| ID | u    |
+----+------+
|  1 |   20 |
+----+------+
MysqL> replacE into foo (u) values (20);
MysqL> SELEct * from foo;
+----+------+
| ID | u    |
+----+------+
|  3 |   20 |
+----+------+

解决方法

在执行INSERT包含多行的语句时,我想跳过重复的条目,否则它们会导致失败。经过研究后,我的选择似乎是使用以下任一方法:

  • ON DUPLICATE KEY updatE 这意味着要付出一定代价进行不必要的更新,或者
  • INSERT IGNORE 这暗示了其他类型的失败的邀请。

这些假设对吗?跳过可能导致重复的行并继续其他行的最佳方法是什么?

大佬总结

以上是大佬教程为你收集整理的“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”全部内容,希望文章能够帮你解决“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。