利用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列是主健,但有些数据就没了
以上是关于利用mysql存储过程循环插入新数据并更新的主要内容,如果未能解决你的问题,请参考以下文章