我从谷歌开始搜索,找到了关于互斥表的文章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的元数据,由于各种原因,管道 在行刑的任何一步都可能被打破.因此,我们需要确保两个 事情:

  1. 反复执行流水线不会 destruct 我们的 >;数据库
  1. 重复处决不会因为"重复"而死亡

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.我也建议

Php相关问答推荐

相同的数组(一个来自func_get_args(),另一个显式构建)在用作参数时并不相同

输入手写CSV时在PHP中进行日期判断

在PHP中替换数组中的文本并同时使用其他函数

Symfony装置加载:try 从命名空间加载类";ClassUtils";Doctrine\Common\Util";

有没有可能从composer 过时的输出中隐藏不需要的主要版本?

带Redhat php curl的http_code 0

使用HPOS过滤WooCommerce中的订单列表

如何在 apache Laragon - laravel 10 中允许方法 DELETE?

启用 WooCommerce 我的帐户付款方式,允许客户添加付款方式

在 WooCommerce 中应用优惠券时显示购物车商品折扣金额

需要以一种形式执行两个操作

Symfony:从控制器内部调用自定义命令

根据小计向 WooCommerce Checkout 添加佣金

WooCommerce:如果订单总数为零,则隐藏本地取货运输选项

在 vue 自定义渲染器中访问变量

使用 PHP 的 OAuth 2.0 MAC

.htaccess环境变量条件不被判断

如何使用动态变量定义 bind_result?

即使密码匹配,密码处理程序也会返回错误

在 EasyAdmin 中添加全局操作,将我的按钮放在表格下方而不是上方