当前位置: 首页 > 面试题库 >

仅当记录不存在时才将SQL插入表中[重复]

慕宪
2023-03-14
问题内容

这个问题已经在这里有了答案

检查是否存在一行,否则插入 (11个答案)

MySQL条件插入 (12个答案)

6年前关闭。

我想运行一组查询以将一些数据插入SQL表中,但前提是要满足满足某些条件的记录。该表有4个字段:(id主要)fund_iddateprice

我在查询3个字段:fund_iddateprice

所以我的查询将是这样的:

INSERT INTO funds (fund_id, date, price)
    VALUES (23, '2013-02-12', 22.43)
    WHERE NOT EXISTS (
       SELECT * 
       FROM funds 
       WHERE fund_id = 23
         AND date = '2013-02-12'
    );

因此,我只想在fund_id与和匹配的记录date尚不存在时插入数据。如果上面的方法是正确的,那么我就觉得这是一种效率很低的方法,因为每次都必须运行一条附加的select语句。

是否有更好的方法来实现上述目标?

编辑:为澄清起见,fund_id也不date是唯一字段;共享相同的fund_id或日期的记录将存在,但是没有记录应具有相同的fund_id和日期。


问题答案:

尽管我最初标记为选择的答案是正确的,并且达到了我的要求,但是有一种更好的方法可以做到这一点(其他人也承认但没有考虑)。应该在包含fund_id和的表上创建一个复合唯一索引date

ALTER TABLE funds ADD UNIQUE KEY `fund_date` (`fund_id`, `date`);

然后在插入记录时,在遇到冲突时添加条件:

INSERT INTO funds (`fund_id`, `date`, `price`)
    VALUES (23, DATE('2013-02-12'), 22.5)
        ON DUPLICATE KEY UPDATE `price` = `price`; --this keeps the price what it was (no change to the table) or:

INSERT INTO funds (`fund_id`, `date`, `price`)
    VALUES (23, DATE('2013-02-12'), 22.5)
        ON DUPLICATE KEY UPDATE `price` = 22.5; --this updates the price to the new value

这将为子查询提供更好的性能,并且表的结构更好。需要注意的是,您的唯一键列中不能包含NULL值,因为MySQL仍将它们视为值。



 类似资料:
  • 问题内容: 我正在使用SQL Server 2012。 我有用于存储用户的表。允许的最大用户数为100万。我有一个要在其中注册用户的程序。当我插入时,我想确保用户表中的总行数不会超过100万。我宁愿使用允许最大并发性的方法。 我相信我可以使用ISOLATION LEVEL为SERIALIZABLE的事务,然后首先计算行数,如果总计数少于100万,则插入行。我的理解是SERIALIZABLE的限制非

  • 问题内容: 我有2张桌子- : 第二张桌子- : 我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单条件的已取消,但由于未在此处取消工作,因此我在努力避免未取消。 问题答案: 要么: 第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。 第二个版本有效,因为返回第一个表中所有行的一行。当条件成功,这些行会包括从第二表中的列,就像

  • 我想向数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行。 我的问题是: 但是,它将继续插入新的记录。假设是唯一键。如果存在,则不会将新记录插入数据库;同时更新记录。 我也试过这个: 我不确定我的代码是否存在for循环问题。 我使用for循环插入所有数据。 这是echo$query的输出; SQL表

  • 问题内容: 我正在尝试执行以下查询: 但这会返回错误。基本上,如果该记录的“名称”字段已经存在于另一条记录中,我不想插入一条记录-如何检查新名称是否唯一? 问题答案: 我实际上并不建议您这样做,因为Piskvor和其他人建议的索引是一种更好的方法,但是您实际上可以做您想做的事情: 插入一条记录: 尝试再次插入相同的记录: 插入其他记录: 等等… 更新: 为了防止在两个值相等的情况下出错,您必须命名

  • 问题内容: 我需要将以下行添加到配置文件的末尾: 到一个名为 我正在寻找用于执行此操作的方法,但无法解决。 如果该行尚不存在,我将如何插入? 问题答案: 保持简单:) grep + echo 应该足够了: 安静 整行匹配 模式是一个普通的字符串 https://linux.die.net/man/1/grep 编辑:合并@cerin和@ thijs-wouters建议 。

  • 问题内容: 这个问题已经在这里有了答案 : 如何在MySQL中“如果不存在则插入”? (10个回答) 7年前关闭。 我有一个mysql表… 我只想添加不在列中的记录。 对于前 我有以下记录要添加到表中 我不想添加,因为它已经在列中。 那么,查询是否有可能先检查记录然后插入? 目前,我正在使用..首先,我先进行记录,然后对其进行匹配,然后再对其进行匹配。 但是,我只想处理一个查询。 问题答案: 您可