这个问题在这里已有答案:
我想运行一组查询来将一些数据插入到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和日期 .
3 回答
这可能是实现此目的的简单解决方案:
p.s. 或者(如果
ID
是主键):见this Fiddle .
虽然我最初标记为选择的答案是正确的,并达到了我所要求的更好的方法(其他人承认但没有进入) . 应在包含
fund_id
和date
的表上创建复合唯一索引 .然后在插入记录时添加遇到冲突时的条件:
这将为子查询提供更好的性能,并且表的结构更优越 . 它伴随着一个警告,即您的唯一键列中不能包含NULL值,因为它们仍然被MySQL视为值 .
假设您无法修改DDL(以创建唯一约束)或仅限于能够编写DML,那么针对整个表检查值的过滤结果是否为null
FIDDLE