利用mysql存储过程循环插入新数据并更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用mysql存储过程循环插入新数据并更新相关的知识,希望对你有一定的参考价值。

参考技术A DROP PROCEDURE IF EXISTS excute_job_v340;

create procedure excute_job_v340()

begin 

        declare rdevid int; //声明参数

        declare rech_id int;

        declare slot int;

        declare new_rech_id int;

        declare new_price DOUBLE;//声明参数

        declare done INT DEFAULT FALSE;////声明结束标识参数

    --  声明游标

        DECLARE rdevrech_id CURSOR FOR

                select r.id as rdevid,r.rechargeconfig_id as rech_id,r.slot_no as slot from b_device_tbl dev

                LEFT JOIN r_device_rechargeconfig_tbl r on dev.id= r.device_id

                where dev.dev_typedef_id =7 and dev.masterid is not NULL  and r.rechargeconfig_type=4 and r.is_deleted=0 and                 r.slot_no is not  NULL;

-- 将结束标志绑定到游标

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- 打开游标

        OPEN  rdevrech_id;   

-- 遍历

        read_loop: LOOP

-- 取值

                FETCH  NEXT from rdevrech_id INTO rdevid,rech_id,slot;

                IF done THEN

                        LEAVE read_loop;

                END IF;// 结束判断

                select price into new_price from c_device_rechargeconfig_item_tbl where rechargeconfig_id =rech_id limit 1;

                INSERT INTO `c_device_rechargeconfig_tbl` (  `type`, `style_id`, `is_default`, `dev_type_code`, `is_deleted`,                 `create_time`, `slot_no`)

                VALUES ( '4', NULL, '0', '0', '0', '2019-08-19 15:59:24',slot );

                select max(id) into new_rech_id from c_device_rechargeconfig_tbl ;

                INSERT INTO  `c_device_rechargeconfig_item_tbl` (  `price`, `goods`, `description`, `is_deleted`, `create_time`,                         `rechargeconfig_id` )

                        VALUES (  new_price,new_price, '0.00', '0', '2019-08-19 15:59:24', new_rech_id);

                update r_device_rechargeconfig_tbl set rechargeconfig_id=new_rech_id where id=rdevid;

        END LOOP;

        CLOSE rdevrech_id;

end;

call excute_job_v340() ;//调用执行

mysql 存储过程 若主键冲突则更新,不冲突则插入数据

我写了一个存储过程,需要往一个主键为 IDDATE的表里插入数据。
当主键冲突的时候,就更新数据,不冲突的时候则插入新数据。
但是麻烦的是这批数据是select出来的批量数据,请问如何在满足上述条件的情况下,批量插入和更新?
比如说以下这个语句,怎样可以实现 id是主键
insert into table1
select
a.id as id,
a.c_id as cid,
b.m_id as mid,
c.name as name
from
table_A a,
table_B b,
table_C c
where
b.id=a.c_id
and c.id=b.m_id
ON DUPLICETE KEY UPDATE
c_id=values(a.c_id),
m_id=values(b.m_id),
name=values(c.name)

你可以分两部份导入
先导入在表里有IDDATE的更新部份

mysql> UPDATE 表1 SET 列名=(SELECT 列名 FROM 表2
WHERE 表1.IDDATE=表2.IDDATE)
WHERE IDDATE in (SELECT IDDATE FROM 表2);

再导入插入部份
INSERT INTO 表1 (SELECT IDDATE,列名 FROM 表2
WHERE DDATE not in (SELECT IDDATE FROM 表2));追问

不可能这样做的,数据写在SP里,每次过来的数据流都是单条数据。

追答

按你补充的提问,想实现ID是主键,可以把TABLE_A的ID列进行分组
insert into table1
select
a.id as id,
a.c_id as cid,
b.m_id as mid,
c.name as name
from
(select id,max(c_id) from table_A group by id) a,
table_B b,
table_C c
where
b.id=a.c_id
and c.id=b.m_id
ON DUPLICETE KEY UPDATE
c_id=values(a.c_id),
m_id=values(b.m_id),
name=values(c.name)

当然这样得到的数据是确保了ID列是主健,但有些数据就没了

参考技术A merge语句处理,根据条件选择插入还是更新,但是我不知道mysql是否支持

以上是关于利用mysql存储过程循环插入新数据并更新的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程怎样批量插入新数据

mysql存储过程实现数据查询与插入

MySQL存储过程循环遍历变量并插入临时表

mysql写存储过程对单表插入测试数据,出问题

mysql存储过程怎样批量插入数据

mysql存储过程嵌套循环并分页处理数据