一尘不染

仅当记录不存在时才将SQL插入表中

mysql

我想运行一组查询以将一些数据插入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和日期。


阅读 390

收藏
2020-05-17

共1个答案

一尘不染

尽管我最初标记为选择的答案是正确的,并且达到了我的要求,但是有一种更好的方法可以做到这一点(其他人也承认但没有考虑)。应该在包含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仍将它们视为值。

2020-05-17