美文网首页
Mysql:关联表批量更新

Mysql:关联表批量更新

作者: 小菜荔枝 | 来源:发表于2019-01-23 15:27 被阅读0次

    问题和背景

    我们在写 sql 语句的时候,经常会涉及到关联表更新,举例:
    下面有两个表 userkpi_ratio,下面想计算 user 表每个人的 kpi(现在是0),两个表的 id 是可以关联的,公式 kpi = 100 * ratio

    user 表:
    +----+--------------+-----+
    | id | name         | kpi |
    +----+--------------+-----+
    |  1 | 贝克汉姆      |   0 |
    |  2 | 姆巴佩        |   0 |
    |  3 | 卡卡          |   0 |
    +----+--------------+-----+
    
    kpi_ratio 表:
    +----+-------+
    | id | ratio |
    +----+-------+
    |  1 |   0.5 |
    |  2 |   0.7 |
    |  3 |     0 |
    +----+-------+
    

    update inner join 解决

    update user u inner join kpi_ratio kr on u.id = kr.id
    set u.kpi = 100 * kr.ratio where 1=1 -- where 1=1 是为了安全执行sql,与逻辑无关
    -- 或者
    update user u, kpi_ratio kr
    set u.kpi = 100 * kr.ratio
    where u.id = kr.id
    

    执行结果正确:

    +----+--------------+-----+
    | id | name         | kpi |
    +----+--------------+-----+
    |  1 | 贝克汉姆     |  50 |
    |  2 | 姆巴佩       |  70 |
    |  3 | 卡卡         |   0 |
    +----+--------------+-----+
    

    建表语句

    -- 创建员工表
    create table user
    (
        id int auto_increment comment '主键id',
        name varchar(32) default '' not null comment '名字',
        kpi int default 0 not null comment '绩效',
        constraint user_pk
            primary key (id)
    )
    comment '员工';
    
    -- 绩效系数表
    create table kpi_ratio
    (
        id int not null comment '员工id',
        ratio double default 0 not null,
        constraint kpi_ratio_pk
            primary key (id)
    )
    comment '绩效系数';
    
    -- 插入数据
    insert into user(name, kpi) values ('贝克汉姆', 0);
    insert into user(name, kpi) values ('姆巴佩', 0);
    insert into user(name, kpi) values ('卡卡', 0);
    insert into kpi_ratio values (1, 0.5);
    insert into kpi_ratio values (2, 0.7);
    insert into kpi_ratio values (3, 0);
    

    简书作者 小菜荔枝原创 转载请联系作者获得授权

    相关文章

      网友评论

          本文标题:Mysql:关联表批量更新

          本文链接:https://www.haomeiwen.com/subject/tcbjjqtx.html