我从谷歌搜索开始,找到了一篇关于如何在标准SQL中编写INSERT if NOT EXISTS查询的文章,这篇文章讨论了互斥表
我有一张有1400万张唱片的桌子。如果我想以相同的格式添加更多数据,是否有办法确保我要插入的记录在不使用一对查询的情况下不存在(即,一个要检查的查询和一个要插入的查询的结果集是否为空)
字段上的unique约束是否保证insert在它已经存在的情况下会失败
似乎只有一个约束,当我通过PHP发出insert时,脚本发出嘎嘎声
使用将忽略插入到表中
还有INSERT…ON DUPLICATE KEY UPDATE语法,您可以在13.2.6.2 INSERT。。。关于重复的密钥更新语句
根据谷歌的网络缓存从bogdan.org.ua发帖:
2007年10月18日
首先:从最新的MySQL开始,标题中显示的语法不是
可能的但有几种非常简单的方法可以实现真正的目标
预期使用现有功能有3种可能的解决方案:使用插入忽略、替换或
在重复密钥更新时插入假设我们有一张桌子:
创建表“成绩单”( `ensembl_转录本_id`varchar(20)非空, `成绩单_chrom_start`int(10)未签名非空, `成绩单_chrom_end`int(10)未签名非空, 主键(`ensembl\u转录本\u id`) )ENGINE=InnoDB默认字符集=1;现在想象一下,我们有一个自动导入成绩单的管道
来自Ensembl的元数据,以及由于管道中的各种原因
在执行的任何步骤中都可能被破坏。因此,我们需要确保两个目标
事情:
- 重复执行管道不会破坏我们的安全
&燃气轮机;数据库
- 重复执行不会因“重复”而死亡
&燃气轮机;主键的错误方法1:使用替换
很简单:
替换为“成绩单”` 设置'ensembl_transcript_id`='ensorgt0000000001', `成绩单\u chrom\u start`=12345, `转录本`=12678;如果该记录存在,将被覆盖;如果还没有
如果存在,它将被创建。然而,使用这种方法并不有效
对于我们的情况:我们不需要覆盖现有记录,这很好
只是为了跳过它们方法2:使用插入忽略也很简单:
在“成绩单”中插入忽略` 设置'ensembl_transcript_id`='ensorgt0000000001', `成绩单\u chrom\u start`=12345, `转录本`=12678;这里,如果“ensembl_转录本_id”已经存在于
数据库,将自动跳过(忽略)。(更准确地说,
这里引用了MySQL参考手册中的一句话:“如果您使用忽略
关键字,执行INSERT语句时发生的错误包括
改为视为警告。例如,在不忽略的情况下,一行
复制表中现有的唯一索引或主键值
如果
记录尚不存在,将创建该记录第二种方法有几个潜在的弱点,包括
如果出现任何其他问题,则不终止查询(请参阅
手册)。因此,如果之前测试时未使用
忽略关键字方法3:在重复密钥更新时使用INSERT…:
第三个选项是在重复密钥更新时使用
INSERT…
语法,在更新部分什么都不做,做一些没有意义的事情
(空)操作,如计算0+0(Geoffray建议执行
id=MySQL优化引擎忽略此项的id分配
操作)。这种方法的优点是它只忽略重复项
键事件,但仍会中止其他错误最后一点:这篇文章的灵感来自Xaprb。我还建议
参考他的另一篇关于编写灵活的SQL查询的文章