如何在 MySQL 中执行“如果不存在则插入”?

2024-03-22

我首先通过谷歌搜索找到了这篇文章如何在标准 SQL 中编写 INSERT if NOT EXISTS 查询 http://www.xaprb.com/blog/2005/09/25/insert-if-not-exists-queries-in-mysql/其中讨论了互斥表。

我有一个包含约 1400 万条记录的表。如果我想添加更多相同格式的数据,有没有办法确保我要插入的记录尚不存在不使用一对查询(即,如果结果集为空,则要检查一个查询并插入一个查询)?

Does a unique对字段的约束保证insert如果已经存在就会失败?

看来与merely一个限制,当我通过 PHP 发出插入时,脚本发出嘎嘎声。


Use INSERT IGNORE INTO table.

还有INSERT … ON DUPLICATE KEY UPDATE语法,您可以在中找到解释13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE 语句 https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html.


发帖自bogdan.org.ua https://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html根据谷歌的网络缓存 https://web.archive.org/web/20191028155933/http://webcache.googleusercontent.com/search?q=cache:bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html:

2007 年 10 月 18 日

首先:从最新的 MySQL 开始,标题中提供的语法不是 可能的。但有几种非常简单的方法可以实现 预期使用现有功能。

有 3 种可能的解决方案:使用 INSERT IGNORE、REPLACE 或 在重复密钥更新时插入...。

假设我们有一张桌子:

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;

现在想象我们有一个自动导入转录本的管道 来自 Ensembl 的元数据,并且由于各种原因管道 可能在执行的任何步骤中被破坏。因此,我们需要保证两个 事物:

  1. 管道的重复执行不会破坏我们的 > 数据库
  1. 重复处决不会因为“重复”而死亡 > 主键错误。

方法一:使用REPLACE

这很简单:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

如果记录存在,则覆盖;如果还没有 存在,就会被创建。然而,使用这种方法效率不高 对于我们的情况:我们不需要覆盖现有记录,这很好 只是为了跳过它们。

方法2:使用INSERT IGNORE 也很简单:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

在这里,如果“ensembl_transcript_id”已经存在于 数据库,它将被默默地跳过(忽略)。 (更准确地说, 这里引用 MySQL 参考手册:“如果你使用 IGNORE 关键字,执行 INSERT 语句时发生的错误是 而是将其视为警告。例如,如果没有 IGNORE,则该行 复制表中现有的 UNIQUE 索引或 PRIMARY KEY 值 导致重复键错误并且语句被中止。”。)如果 记录尚不存在,将被创建。

第二种方法有几个潜在的缺点,包括 如果发生任何其他问题,查询不会中止(请参阅 手动的)。因此,如果之前没有进行过测试,则应使用它 忽略关键字。

方法 3:使用 INSERT … ON DUPLICATE KEY UPDATE:

第三个选项是使用INSERT … ON DUPLICATE KEY UPDATE语法,并且在 UPDATE 部分只是什么都不做,做一些无意义的事情 (空)运算,例如计算 0+0(Geoffray 建议执行以下操作) id=id 分配让 MySQL 优化引擎忽略这一点 手术)。这种方法的优点是它只忽略重复的 关键事件,并且仍然因其他错误而中止。

最后声明:这篇文章的灵感来自 Xaprb。我还建议 请参阅他关于编写灵活的 SQL 查询的另一篇文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MySQL 中执行“如果不存在则插入”? 的相关文章

  • 在 MySQL 中进行全文搜索的最有效方法

    我有 3 个表 我想查询搜索词文本框 我的查询目前看起来像这样 SELECT Artist FROM Artist Band Instrument WHERE MATCH Artist name AGAINST mysearchterm O
  • 从名字和姓氏生成唯一的用户名?

    我的数据库中有很多用户 我想将他们的所有用户名重置为他们名字的第一个字母 加上他们的完整姓氏 正如你可以想象的那样 有一些骗子 在这种情况下 我想在用户名末尾添加 2 或 3 或其他内容 我将如何编写查询来生成这样的唯一用户名 UPDATE
  • Rails 中 WHERE 子句中的 ALL 运算符

    关联关系如下图所示 InstructorStudent has many fees Fee belongs to instructor student 我想要获得在所有给定数组中具有每月详细信息的指导学生 如果其中任何一个中不存在每月详细信
  • 重建数据库中的所有索引

    我有一个非常大的 SQL Server 2008 R2 数据库 1 5TB 并将在同一个表中的列之间复制一些数据 我被告知该架构有大量索引 并且想知道是否有默认查询或脚本可以重建所有索引 是否也被建议同时更新统计数据 30 个表中的每一个都
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • MySQL小写自动转换

    我有多个在数据库表中写入数据的 Web 服务 我想针对特定字段自动将大写字符串转换为小写字符串 mysql 有没有执行此任务的函数 假设这是表 id name language 有时 在语言字段内 Web 服务会写入大写字符串 IT 我想直
  • 一张表中按最大日期过滤重复行的 SQL 查询

    我有一个 SQL 数据库 persons 它具有基于 IDNum 列的重复条目 我需要查询条目并仅根据最新创建日期显示行或重复条目 这是查询 SELECT IDNum PersonPGUID CreatedDateTime FirstNam
  • Errno 121,写入或更新时出现重复密钥?

    SET OLD UNIQUE CHECKS UNIQUE CHECKS UNIQUE CHECKS 0 SET OLD FOREIGN KEY CHECKS FOREIGN KEY CHECKS FOREIGN KEY CHECKS 0 S
  • 使用 Proc sql 和 Teradata 在 SAS 中编写高效查询

    编辑 这是一组更完整的代码 它准确地显示了下面的答案所发生的情况 libname output data files jeff let DateStart 01Jan2013 d let DateEnd 01Jun2013 d proc s
  • 我的用例可以合并到单个查询中而不影响性能吗?

    我主要着眼于改善表现查询的内容以及是否能够解决单一查询对于我的用例之一 解释如下 涉及到2张表 Table 1 EMPLOYEE column1 column2 email1 email2 column5 column6 Table 2 E
  • PHP多图像文件上传并存储到文件夹和数据库

    我正在建立一个网站 向夜间狂欢者展示大城市夜总会场所和活动的列表 我正在尝试构建一个后端页面 管理员可以在其中添加俱乐部并输入信息 例如机构名称 位置 相对价格等 当然还有俱乐部的一些图像 每个俱乐部必须至少有一张图像 即主图像 可以有额外
  • 查询嵌套查询结果中两列的位置

    我正在编写这样的查询 select from myTable where X in select X from Y and XX in select X from Y X 列和 XX 列的值必须位于同一查询的结果中 select X fro
  • PHP:如何检查总数。 URL 中的参数?

    我正在使用 REQUEST 检索参数 有没有办法找到总数 URL 中的参数 而不是检索每个参数然后进行计数 这将为您提供总数 分隔的 URL 查询参数 count explode SERVER QUERY STRING 如果您只想要唯一的参
  • 合并并添加两个表中的值

    是否可以制作一个在两个表中添加值的查询 例如 假设您有两张表 id value a 1 c 2 d 3 f 4 g 5 and id value a 1 b 2 c 3 d 4 e 5 然后 当您 添加 两个表时 您将获得 id 匹配的结果
  • 在 LINQ 中执行 FirstOrDefault 的替代方法

    我有一个成员资格表 用于记录用户是否是列表的成员 当用户的成员资格发生更新时 会写入新记录 并且先前的记录保持原样 从而可以维护其成员资格的历史记录 要获取用户的会员身份 需要选择他们最近的条目 下面是一些用户列表成员资格数据的示例 目的是
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • 如何在审计触发器中使用system_user但仍使用连接池?

    我想做以下两件事 在我的数据库表上使用审计触发器来识别哪个用户更新了什么 使用连接池来提高性能 对于 1 我在数据库触发器中使用 system user 来识别进行更改的用户 但这阻止我执行需要通用连接字符串的 2 有没有一种方法可以让我充
  • SQL Server 2008 R2 内连接无法匹配 varchar 字段,因为它包含特殊字符

    我们正在将 Microsoft SQL Server 2008 R2 用于我们的经典 ASP 应用程序之一 我们有两张表 TableA TableB TableA有以下列 InstName varchar 1024 TableB有这些列 I
  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码
  • 作为 UDF 结果的列上的 Where 子句

    我有一个用户定义的函数 例如myUDF a b 返回一个整数 我试图确保该函数仅被调用一次 并且其结果可以用作WHERE clause SELECT col1 col2 col3 myUDF col1 col2 AS X From myTa

随机推荐