【发布时间】:2019-10-28 23:53:48
【问题描述】:
我在通过存储过程将数据插入表中时遇到了一些问题。请允许我详细解释一下。
我有三张桌子
CREATE TABLE `table_1` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`s_id` INT(11) NOT NULL,
`created` DATE NOT NULL,
`val` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;
CREATE TABLE `table_2` (
`s_id` INT(11) NOT NULL AUTO_INCREMENT,
`t_id` INT(11) NOT NULL,
`p_id` INT(11) NOT NULL,
`d_id` INT(11) NOT NULL,
`created` DATE NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;
CREATE TABLE `table_3` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`count` INT(11) NOT NULL,
`created` DATE NOT NULL,
`s_id` VARCHAR(255) NOT NULL,
`t_id` VARCHAR(255) NOT NULL,
`p_id` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
)
有没有办法使用 select 语句通过存储过程插入到第二个表中。会有多个数据为Select * from table_1;然后就会有类似if(table_1.s_id == table_3.s_id) THEN UPDATE table_3 set count = count +1 ELSE INSERT into table_3(s_id,t_id.....
虽然我尝试过使用光标,但它只插入一条记录。
这是我使用光标的例子
DECLARE done INT DEFAULT FALSE;
DECLARE curs_count INT(11) DEFAULT 0;
DECLARE v_s_id BIGINT(20) DEFAULT 0;
DECLARE v_t_id BIGINT(20) DEFAULT 0;
DECLARE v_p_id BIGINT(20) DEFAULT 0;
DECLARE v_t_date BIGINT(20) DEFAULT 0;
DECLARE co_s_id BIGINT(20) DEFAULT 0;
DECLARE curs CURSOR FOR
SELECT
a.id,b.s_id,b.t_id,b.created
FROM
table_1 a
INNER JOIN table_2 b ON a.s_id = b.s_id
WHERE
a.val <> '';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DECLARE curs_id INT(11) DEFAULT 0;
OPEN curs;
SELECT FOUND_ROWS() INTO curs_count;
start_loop: loop
FETCH curs INTO curs_id,v_s_id,v_t_id,v_c_date;
IF done THEN
LEAVE start_loop;
END IF;
SELECT s_id INTO co_s_id FROM table_3;
IF co_s_id>0
THEN
update table_3 SET count = count+1 where s_id = co_s_id;
ELSE
INSERT INTO table_3 (support_id,track_id,track_date,count) VALUES (v_s_id,v_t_id,v_c_date,1);
END IF;
end loop;
CLOSE curs;
谁能帮我解决这个问题?
【问题讨论】:
-
它可以在没有 SP 的情况下完成...只需使用
INSERT INTO ... SELECT ...语法参见 manual -
感谢您的评论雷蒙德。虽然我可以使用客户端脚本语言来处理此请求,但在此过程之前,一些其他进程也由存储过程运行,因此我别无选择在 SP 中运行全选记录。但是由于我对存储过程不太熟悉,所以我无法在 Select 语句“SELECT * FROM table_1”之后处理每条记录;有根据条件更新表3或插入表3的过程。其实我需要在 SP 中查询
-
我很惊讶你在这里没有永远循环,因为你从不检查完成。
-
这实际上是一个示例代码。我认为我没有正确处理循环,因为我得到了无限的结果,但实际上我想访问 table_1 中的所有 122 个结果。我不知道如何在单个查询中获取所有 122 条记录,然后由 SP 处理。
-
我得到了解决方案 P.Salmon。感谢您的帮助虽然我发现这段代码实际上是我的。但不知何故,由于我之前的无限循环,我的表被破坏了。
标签: mysql stored-procedures multi-query multirow