我从谷歌开始搜索,找到了关于互斥表的文章100.
我有一张有1400万张唱片的桌子.如果我想以相同的格式添加更多数据,是否有办法确保我要插入的记录不存在,而不使用一对查询(即,一个要判断的查询和一个要插入的查询,结果集是否为空)?
如果一个字段上有unique
个限制,那么insert
会失败吗?
似乎使用merely个约束时,当我通过PHP发出INSERT时,脚本会嘎嘎作响.
我从谷歌开始搜索,找到了关于互斥表的文章100.
我有一张有1400万张唱片的桌子.如果我想以相同的格式添加更多数据,是否有办法确保我要插入的记录不存在,而不使用一对查询(即,一个要判断的查询和一个要插入的查询,结果集是否为空)?
如果一个字段上有unique
个限制,那么insert
会失败吗?
似乎使用merely个约束时,当我通过PHP发出INSERT时,脚本会嘎嘎作响.
使用INSERT IGNORE INTO table
.
还有INSERT … ON DUPLICATE KEY UPDATE
种语法,你可以在100种语法中找到解释.
Post from 100 according to 101:
2007年10月18日
首先:从最新的MySQL开始,标题中的语法就不再是了
有三种可能的解决方案:使用插入忽略、替换或
假设我们有一张桌子:
CREATE TABLE `transcripts` ( `ensembl_transcript_id` varchar(20) NOT NULL, `transcript_chrom_start` int(10) unsigned NOT NULL, `transcript_chrom_end` int(10) unsigned NOT NULL, PRIMARY KEY (`ensembl_transcript_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
现在假设我们有一条自动管道导入文本 来自Ensemb1的元数据,由于各种原因,管道 在行刑的任何一步都可能被打破.因此,我们需要确保两个 事情:
- 反复执行流水线不会 destruct 我们的 >;数据库
- 重复处决不会因为"重复"而死亡
Method 1: using REPLACE
很简单:
REPLACE INTO `transcripts` SET `ensembl_transcript_id` = 'ENSORGT00000000001', `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
如果该记录存在,它将被覆盖;如果它还不存在 存在,它将被创建.但是,使用此方法效率不高 对于我们的情况:我们不需要覆盖现有记录,这很好 只是为了跳过它们.
Method 2: using INSERT IGNORE Also very simple:
INSERT IGNORE INTO `transcripts` SET `ensembl_transcript_id` = 'ENSORGT00000000001', `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
这里,如果"ensembl_转录本_id"已经出现在
第二种方法有几个潜在的弱点,包括
Method 3: using INSERT … ON DUPLICATE KEY UPDATE:个
第三种 Select 是使用
INSERT … ON DUPLICATE KEY UPDATE
最后一点:这篇文章的灵感来自Xaprb.我也建议