我有一个存储过程,其内容如下:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE DEFINER=`MailMe`@`%` PROCEDURE `sp_archivev3`()
BEGIN
INSERT INTO
send.sgev3_archive(a_bi,
b_vc,
c_int,
d_int,
e_vc,
f_vc,
g_vc,
h_vc,
i_dt,
j_vc,
k_vc,
l_vc,
m_dt,
n_vch,
o_bit)
SELECT a_bi,
b_vc,
c_int,
d_int,
e_vc,
f_vc,
g_vc,
h_vc,
i_dt,
j_vc,
k_vc,
l_vc,
m_dt,
n_vch,
o_bit
FROM send.sgev3
WHERE m_dt BETWEEN '2014-06-09' AND CURDATE();
END
因为,我的查询是将记录从send.sgev3_archive
插入send.sgev3
。我想再做一件事。我想删除send.sgev3
表中的记录,然后选择并将其插入send.sgev3_archive
。我应该在上面的代码中的SELECT查询下面写DELETE
查询吗?只是想确认一下,因为我不想弄乱我的真实数据并意外删除任何记录而不复制它。请指教。
答案 0 :(得分:3)
是的确切。添加DELETE
声明
DELETE FROM send.sgev3
WHERE m_dt BETWEEN '2014-06-09' AND CURDATE();
更确定INSERT
在DELETE
调用之前完成;将INSERT
和DELETE
换成Transaction Block说
START TRANSACTION;
INSERT INTO send.sgev3_archive ...
SELECT ... FROM send.sgev3
COMMIT;
您还可以使用ROLLBACK
处理您的程序中的错误情况以及exit handler in stored procedure
整个交易。下面的帖子已经显示了一种方法来做同样的事情。看一看。
How can I use transactions in my MySQL stored procedure?
编辑:
为什么交易是必要的?我不能像我一样继续前进 在我的问题中提到过?
而不是解释你为什么;让我们举个例子(非常类似于你的场景)
假设您有一个名为parent
的表格声明为
create table parent(id int not null auto_increment primary key,
`name` varchar(10),city varchar(10));
向其中插入一些记录
insert into parent(`name`,city) values('sfsdfd','sdfsdfdf'),('sfsdfd','sdfsdfdf'),('sfsdfd',null)
现在,您有另一个名为child
的表定义如下(注意最后一列有not null
约束)
create table child(id int not null auto_increment primary key,
`name` varchar(10),city varchar(10) not null)
现在执行以下语句(您当前正在做的事情)
insert into child(`name`,city) select * from parent;
delete from parent;
结果:INSERT
由于not null
表中的child
约束而失败,但delete
将成功。
要避免这种情况,您需要Transaction
。因此,如果INSERT
失败,您根本不会去delete
。
关于如何在事务中处理此问题的伪代码
start transaction
insert into child(`name`,city) select * from parent;
if(ERROR)
rollback
exit from stored proc
else
commit
delete from parent;
SideNote:exit from stored proc
可以使用LEAVE