SQL执行结果错误

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】生产环境4.0.4

【概述】 场景 + 问题概述
扣减库存

【背景】 做过哪些操作

【现象】 业务和数据库现象
QTY_TOTAL原值1, QTY_CAN_USE原值1
INSERT INTO kc_sku_stock ( ID, SKU_CODE, WAREHOUSE_CODE, IS_USE_STATUS, QTY_TOTAL, QTY_CAN_USE, STOCK_TYPE, IS_URGENCY_STATUS, QTY_MAX, QTY_MIN, QTY_WARN, IS_DELETED, CREATED_BY, DATE_CREATED, UPDATED_BY, DATE_UPDATED, OPT_COUNTER, PRODUCT_TYPE, COMPANY_CODE ) VALUES
(2858286849912734487,‘DW21X3571AD36230’,‘D832’,‘1’,IFNULL(0,0)-IFNULL(1,0),IFNULL(0,0)-IFNULL(1,0),‘1’,‘1’,‘5000’,‘0’,‘1’,‘0’,‘admin’,now(),‘admin’,now(),‘5’,‘0’,‘8070’) ON DUPLICATE KEY UPDATE QTY_TOTAL = IFNULL(QTY_TOTAL,0) +VALUES(QTY_TOTAL), QTY_CAN_USE = IFNULL(QTY_CAN_USE,0) +VALUES(QTY_CAN_USE), DATE_UPDATED = now()

期望结果:QTY_TOTAL 值0, QTY_CAN_USE值0
实际结果:QTY_TOTAL 值-1, QTY_CAN_USE值-1

【问题】 当前遇到的问题,参考 AskTUG 的 Troubleshooting 读性能慢-慢语句

【统计信息是否最新】

    【执行计划内容】

    【 SQL 文本、schema 以及 数据分布】

【业务影响】

【TiDB 版本】

【附件】 相关日志及监控(https://metricstool.pingcap.com/)

  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview Grafana监控
  • TiDB Grafana 监控
  • TiKV Grafana 监控
  • PD Grafana 监控
  • 对应模块日志(包含问题前后 1 小时日志)

对应的 kc_sku_stock 表的表结构辛苦也提供下吧,这边在本地复现看下~

1赞

方便粘下文本格式(非截图)的吗?辛苦 :joy:

CREATE TABLE kc_sku_stock (
ID bigint(20) NOT NULL DEFAULT 0,
SKU_CODE varchar(40) NOT NULL,
WAREHOUSE_CODE varchar(20) NOT NULL,
IS_USE_STATUS int(1) DEFAULT NULL COMMENT ‘库存状态:0-不可用;1-可用’,
QTY_TOTAL bigint(20) DEFAULT 0 COMMENT ‘总库存数’,
QTY_CAN_USE int(11) DEFAULT 0 COMMENT ‘可用库存’,
STOCK_TYPE int(2) DEFAULT NULL COMMENT ‘1:普通库存 2:活动库存,3:积分库存’,
PROMOTION_CODE varchar(64) DEFAULT NULL COMMENT ‘活动CODe’,
QTY_RESERVED int(11) DEFAULT 0 COMMENT ‘冻结库存数’,
QTY_URGENCY int(11) DEFAULT NULL COMMENT ‘紧急库存数’,
IS_URGENCY_STATUS int(1) DEFAULT NULL COMMENT ‘紧急库存数状态:0-不可用;1-可用’,
QTY_MAX int(11) DEFAULT NULL COMMENT ‘最高库存数量’,
QTY_MIN int(11) DEFAULT NULL COMMENT ‘最低库存数量’,
QTY_WARN int(1) DEFAULT NULL COMMENT ‘预警标示:1-安全状态;2-低于最低库存数量,需要补货;3-高于最高库存数量’,
QTY_ONWAY int(11) DEFAULT NULL COMMENT ‘在途库存’,
QTY_SAFETY int(11) DEFAULT NULL COMMENT ‘安全库存’,
QTY_LIST int(11) DEFAULT NULL COMMENT ‘商品陈列数’,
MIN_PARAM decimal(10,2) DEFAULT NULL COMMENT ‘库存合理系数’,
MAX_PARAM decimal(10,2) DEFAULT NULL COMMENT ‘最大库存合理系数’,
WARN_EMAIL varchar(1000) DEFAULT NULL COMMENT ‘预警邮箱’,
FIELD1 bigint(20) DEFAULT NULL,
FIELD2 bigint(20) DEFAULT NULL,
FIELD3 bigint(20) DEFAULT 0 COMMENT ‘是否盘点’,
FIELD4 datetime(6) DEFAULT NULL COMMENT ‘更新时间,给微店使用’,
FIELD5 varchar(64) DEFAULT NULL COMMENT ‘00000(第一位促销库存共享1/独享0(默认值),剩余4位数留着备用)’,
FIELD6 varchar(64) DEFAULT NULL,
IS_DELETED int(1) DEFAULT NULL COMMENT ‘删除标识,默认0为正常,1为删除’,
CREATED_BY varchar(64) DEFAULT NULL COMMENT ‘创建人’,
DATE_CREATED datetime(6) DEFAULT NULL COMMENT ‘创建时间’,
UPDATED_BY varchar(64) DEFAULT NULL COMMENT ‘更新人’,
DATE_UPDATED datetime(6) DEFAULT NULL COMMENT ‘更新时间’,
OPT_COUNTER int(11) DEFAULT NULL COMMENT ‘版本号’,
CHANNEL_ID varchar(128) DEFAULT NULL COMMENT ‘渠道仓库id(一个规则可以对应多个渠道,则此字段值为几个渠道的ID组成的String)’,
PERCENT decimal(10,2) DEFAULT NULL COMMENT ‘调拨比例’,
TIME_ON_WAY datetime(6) DEFAULT NULL COMMENT ‘在途库存的到货时间’,
TRANSFER_ORDER_DETAIL_ID bigint(20) DEFAULT NULL COMMENT ‘调拨单ID’,
PRODUCT_TYPE int(11) DEFAULT NULL COMMENT ‘是否虚拟商品 0:否,1:是’,
ZONE_CODE varchar(64) DEFAULT NULL,
COMPANY_CODE varchar(64) DEFAULT NULL,
MERCHANT_CODE varchar(64) DEFAULT NULL,
CHANNEL_CODE varchar(64) DEFAULT NULL,
STOCK_PRODUCT_TYPE varchar(64) DEFAULT NULL COMMENT ‘商品所属大类’,
PRODUCT_YEAR varchar(64) DEFAULT NULL COMMENT ‘商品年份’,
PRODUCT_SEASON varchar(64) DEFAULT NULL COMMENT ‘商品季节’,
PRODUCT_NAME varchar(255) DEFAULT NULL COMMENT ‘商品名称’,
PRODUCT_COLOR varchar(32) DEFAULT NULL COMMENT ‘商品颜色’,
PRODUCT_SIZE varchar(12) DEFAULT ‘’ COMMENT ‘商品尺寸’,
product_code_color varchar(255) DEFAULT NULL COMMENT ‘商品编码+颜色’,
WAREHOUSE_NAME varchar(255) DEFAULT NULL COMMENT ‘门店名’,
SAP_CATEGORY_CODE1 varchar(12) DEFAULT NULL COMMENT ‘商品分类(1级)’,
brand_name varchar(64) DEFAULT NULL COMMENT ‘品牌名’,
brand_id varchar(12) DEFAULT NULL COMMENT ‘品牌编码’,
product_code varchar(32) DEFAULT NULL COMMENT ‘货号’,
AUTO_UPDATED_TIME datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘行记录更新时间’,
SIZE_KIND varchar(8) DEFAULT NULL COMMENT ‘尺码类型’,
sap_category_code4 varchar(24) DEFAULT NULL COMMENT ‘商品分类(4级)’,
PRIMARY KEY (ID),
UNIQUE KEY UNIQUE_WAREHOUSE_SKU (WAREHOUSE_CODE,SKU_CODE),
KEY INDEX_4 (SKU_CODE),
KEY kc_sku_stock_DATE_CREATED_DATE_UPDATED_index (DATE_CREATED,DATE_UPDATED),
KEY INDEX_DATE_UPDATED (DATE_UPDATED),
KEY company_code_index (COMPANY_CODE),
KEY In_AUTO_UPDATED_TIME (AUTO_UPDATED_TIME),
KEY INDEX_SEASON (PRODUCT_SEASON),
KEY STOCK_PRODUCT_TYPE (STOCK_PRODUCT_TYPE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

这边在本地测试两种情况,具体信息如下:

情况一

第一步 插入 QTY_TOTAL 原值 1, QTY_CAN_USE 原值 1 的数据

第二步 执行 Insert on DUPLICATE 语句

image

第三步 查看目标数据

小结

理论上符合预期情况~

情况二

第一步 目标表中没有 PK ID 为 2858286849912734487 的记录

第二步 执行 Insert on DUPLICATE 语句

第三步 查看目标数据

小结

检查结果理论上符合预期 ~