将数据复制到另一个数据库后删除数据

时间:2014-07-11 23:28:56

标签: mysql sql stored-procedures

我有一个存储过程,其内容如下:

-- --------------------------------------------------------------------------------
-- 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查询吗?只是想确认一下,因为我不想弄乱我的真实数据并意外删除任何记录而不复制它。请指教。

1 个答案:

答案 0 :(得分:3)

是的确切。添加DELETE声明

DELETE FROM   send.sgev3
WHERE m_dt BETWEEN  '2014-06-09' AND CURDATE();

更确定INSERTDELETE调用之前完成;将INSERTDELETE换成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?

MySQL Rollback in transaction

编辑:

  

为什么交易是必要的?我不能像我一样继续前进   在我的问题中提到过?

而不是解释你为什么;让我们举个例子(非常类似于你的场景)

假设您有一个名为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

实施