如何用单条MySQL语句实现插入前查询同表ArtCombo值?
可以简化为单条SQL语句实现
当然可以把「查询ArtCombo+插入新记录」的两步操作合并成一条语句,用MySQL的INSERT ... SELECT语法就能直接完成,不需要先查再插。
具体实现代码
你可以把原来的代码改成下面这样:
sql = """ INSERT INTO table1 (Date, ArtSup, ArtTest, ArtCombo) SELECT %s, %s, %s, ArtCombo FROM table1 WHERE ArtTest = %s AND Date BETWEEN CURDATE() - INTERVAL 1 DAY AND CURDATE() """ val = (datetime.now(tz=None), varArtSup, varArtTest, varArtTest) cur.execute(sql, val)
逻辑说明
- 这条语句里,
INSERT的字段值直接从SELECT的结果中获取,SELECT部分完全复用你原来查询ArtCombo的逻辑 - 前三个值(Date、ArtSup、ArtTest)用你准备的变量传入,第四个值
ArtCombo直接从查询结果提取 - 注意这里
ArtTest需要传两次:一次作为插入的字段值,一次作为查询条件的参数
额外注意事项
如果有可能出现查询不到匹配的ArtCombo的情况,你可以:
- 用
COALESCE设置默认值,避免插入空值:
INSERT INTO table1 (Date, ArtSup, ArtTest, ArtCombo) SELECT %s, %s, %s, COALESCE(ArtCombo, '默认物料组合值') FROM table1 WHERE ArtTest = %s AND Date BETWEEN CURDATE() - INTERVAL 1 DAY AND CURDATE()
- 或者确保只在查询到结果时才插入:给
SELECT加LIMIT 1(避免匹配多条时插入重复记录),如果SELECT没有返回行,整个INSERT不会执行,也就不会产生无效记录
内容的提问来源于stack exchange,提问作者hacking_mike
相关产品推荐
相关产品推荐

