MySQL技术问题:如何根据新ID或State变更更新/追加主表数据
解决主表的增量插入问题
嘿,我来帮你搞定这个更新/追加的需求!你之前的语句没成功,核心问题是EXISTS的逻辑搞反了,咱们一步步来修正:
需求回顾
我们要给主表AGILE_TICKETS_DLY插入两种数据:
- 当前表
CURR_AGILE_TICKETS里的全新Chk值(主表完全没有的) - 主表已存在Chk,但state字段和当前表不一样的行
正确的SQL写法
推荐两种可靠的实现方式,你可以根据自己的数据库偏好选择:
方式1:LEFT JOIN 筛选(直观易懂)
INSERT INTO AGILE_TICKETS_DLY (Chk, description, state, date) SELECT curr.Chk, curr.description, curr.state, curr.date FROM CURR_AGILE_TICKETS curr LEFT JOIN AGILE_TICKETS_DLY mstr ON curr.Chk = mstr.Chk WHERE mstr.Chk IS NULL -- 主表无此Chk,属于新数据 OR curr.state != mstr.state; -- 主表有此Chk,但状态已变更
逻辑说明:
LEFT JOIN会保留当前表的所有行,主表能匹配到的行会带出主表的字段,匹配不到的主表字段全为NULLWHERE条件精准筛选出我们需要的两种情况:要么是完全新的Chk,要么是状态变更的旧Chk
方式2:NOT EXISTS 子查询(性能友好)
INSERT INTO AGILE_TICKETS_DLY (Chk, description, state, date) SELECT curr.Chk, curr.description, curr.state, curr.date FROM CURR_AGILE_TICKETS curr WHERE NOT EXISTS ( SELECT 1 FROM AGILE_TICKETS_DLY mstr WHERE curr.Chk = mstr.Chk AND curr.state = mstr.state );
逻辑说明:
- 子查询专门找「主表里和当前行Chk相同且state也相同」的记录
NOT EXISTS就表示:当前行要么没有匹配的Chk,要么匹配到了但state不同——正好符合我们的插入条件
你之前语句的问题
你用EXISTS时,条件写的是curr.chk != mstr.chk OR ...,这会导致:只要主表里有任何一行和当前行Chk不同,或者状态不同,就会选中当前行。哪怕主表里已经有一个相同Chk且状态一致的行,语句也会错误插入,完全违背了需求。
额外建议
尽量不要用SELECT *,而是明确写出要插入的列名。这样如果后续表结构新增字段,你的插入语句不会因为列数不匹配报错,更健壮。
内容的提问来源于stack exchange,提问作者Mandara31
相关产品推荐
相关产品推荐

