大佬教程收集整理的这篇文章主要介绍了“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我建议使用INSERT...oN DUPliCATE KEY updatE
。
如果使用INSERT IGnorE
,那么如果该行导致重复键,则实际上不会插入该行。但是该语句不会产生错误。而是生成警告。这些情况包括:
如果使用replaCE
,MysqL实际上会在内部执行,deletE
然后执行INSERT
内部操作,这会产生一些意外的副作用:
既replaCE
和INSERT...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 IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”全部内容,希望文章能够帮你解决“ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。