2011-02-28 92 views
2

我想将表中的旧记录移动到另一个表。MySQL - 将一个表的子集移动到另一个表

如果我这样做:

INSERT INTO archived_item SELECT * FROM item WHERE is_sold=1 AND sold_at < DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH) 

我只想复制行。但我需要移动他们。

我不认为在运行前一后这个查询是理想:

DELETE FROM item WHERE is_sold=1 AND sold_at < DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH) 

我不希望无论使用任何外部工具。

是否可以通过SQL来实现?

回答

1

据我所知,唯一的方法是运行INSERT查询,然后在源表上运行一个删除查询。没有其他方法可以实现它。

+0

你认为这是一个好办法吗?这不能导致不一致吗? – dan 2011-02-28 10:02:27

+0

那么,您可以使用事务来确保一旦插入到目标表中的记录应该从源表中删除。你在说什么不一致? – 2011-02-28 10:04:26

+0

啊,你是对的! – dan 2011-02-28 10:05:56

1

据我所知,这是不可能的。如果要从旧表中删除数据,则必须明确发出删除命令。

1

一起完成这两个命令没有任何错误。这是一个正确的方式来做你想做的事情。

为了确保您实际上只删除了您移动的那些,您需要将这些命令包装在transaction中。

现在,您仍然可以质疑的唯一事情是确定为归档和工作集设置不同的表。

可能有两个原因:

  • 性能
  • 不同的数据完整性规则应用到两套单独

性能不应该是一个问题,在适当的索引,直到你打了一些非常非常多的记录。这会增加您的用户界面的复杂性,报告转化为维护(如上所述 - 如果不同的规则适用于档案记录,或者数据结构不一样,理由更容易)。

相关问题