仅当记录不存在时才将SQL插入表中
我想运行一组查询以将一些数据插入SQL表中,但前提是要满足满足某些条件的记录。该表有4个字段:(id
主要)fund_id
,date
和price
我在查询3个字段:fund_id
,date
和price
。
所以我的查询将是这样的:
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插入表中 的全部内容, 来源链接: utcz.com/qa/406551.html