mysql通过update修改默认值_MySQL UPDATE查询部分使用默认值更新

我在2个表上运行更新查询(在MySQL 5.6中),如下所示:

UPDATE c_cache cc

JOIN p_cache pc USING (user_id, attribute_id, calculation_quarter)

JOIN batch_table bt USING (user_id, attribute_id, calculation_quarter, client_id, group_code, version_id)

SET cc.epop = SUBSTRING(bt.result, 1, 1),

cc.excl = SUBSTRING(bt.result, 2, 1),

cc.num_result = SUBSTRING(bt.result, 3, 20),

cc.status = 'FR',

pc.epop = IF(bt.enrolled = 2, SUBSTRING(bt.result, 1, 1), 1),

pc.excl = IF(bt.enrolled = 2, SUBSTRING(bt.result, 2, 1), 0),

pc.num_result = IF(bt.enrolled = 2, SUBSTRING(bt.result, 3, 20), REPEAT('0', 20)),

pc.status = IF(pc.status = 'FL2', 'S', 'FR');

p_cache 正在正确更新,但 c_cache 中的3列设置为NULL, status 设置为'S'(这些列的所有默认值) .

被遗漏的行通常是连续的(以块为单位) .

此查询位于存储过程的循环内,该存储过程一直运行直到 p_cache 的所有'S'(陈旧)状态行都标记为'FR'(新鲜),即计算出来 . ( p_cache 的所有行都与 c_cache 存在,并且一一对应) .

batch_table 每次迭代以25000行的批量获取行,并通过一些存储的函数更新 result 列中的计算结果 .

整个存储过程 . 从MySQL事件中调用 . 多个事件同时运行(每个事件用于一组独有的属性)以查找 p_cache 中的过时行,并使用与此类似的查询批量更新两个具有计算结果的缓存表 .

此异常行为仅在 c_cache 上发生,但有时仅发生 .

架构定义是:

CREATE TABLE c_cache (

user_id INT(11) NOT NULL DEFAULT '0',

attribute_id INT(11) NOT NULL DEFAULT '0',

calculation_quarter DATE NOT NULL DEFAULT '0000-00-00',

version_id INT(11) NOT NULL DEFAULT '0',

epop TINYINT(1) DEFAULT NULL,

excl TINYINT(1) DEFAULT NULL,

num_result CHAR(20) DEFAULT NULL,

status ENUM('FR','S','FL1','FL2') NOT NULL DEFAULT 'S',

PRIMARY KEY (user_id, attribute_id, calculation_quarter, version_id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE p_cache (

user_id INT(11) NOT NULL DEFAULT '0',

attribute_id INT(11) NOT NULL DEFAULT '0',

calculation_quarter DATE NOT NULL DEFAULT '0000-00-00',

client_id INT(11) NOT NULL DEFAULT '0',

group_code CHAR(5) NOT NULL DEFAULT '',

epop TINYINT(1) DEFAULT NULL,

excl TINYINT(1) DEFAULT NULL,

num_result CHAR(20) DEFAULT NULL,

status ENUM('FR','S','FL1','FL2','S1','S2') NOT NULL DEFAULT 'S',

PRIMARY KEY (user_id,attribute_id,calculation_quarter,client_id,group_code),

KEY date_status_id_index (calculation_quarter,status,attribute_id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

任何人都可以解释为什么会发生这种情况并建议一种避免这种情况的方法吗?提前致谢 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值