2011-09-14 129 views
2

我想在一个sql语句中处理以下内容 - 我想将记录数复制到归档表中,并立即删除现有的主表。MySQL - 将记录复制到另一个表,并删除现有的一个

喜欢的东西:

INSERT INTO `table_archive` 
SELECT * FROM `table_main` 
WHERE `id` IN (1, 2, 3, 4) 
REMOVE FROM `table_main` WHERE `id` IN (1, 2, 3, 4) 

这基本上就像从一个表剪切和粘贴记录到另一个。

很明显,上面的语句就是我想要实现的 - 任何想法,如果它是可以实现的,它会是什么样的sql语句?

+1

这是不可能的只是一个查询做。 – zerkms

+0

是的 - 这就是我的想法 - 但我可以用一个语句至少插入IN范围的记录吗? – user398341

回答

3

提到你需要使用一些DML命令:

START TRANSACTION; 
INSERT INTO `table_archive` SELECT * FROM `table_main` WHERE `id` IN (1, 2, 3, 4); 
DELETE`table_main` WHERE `id` IN (1, 2, 3, 4); 
COMMIT; 

见:http://dev.mysql.com/doc/refman/5.0/en/commit.html

+0

感谢凯文 - 我认为这回答了我的问题。 – user398341

1

不,您不能在单个查询中执行此操作。但是,您可以尝试在事务中执行此操作,以便将其作为单个查询进行处理。一切都成功了,或者根本不会发生。

这假定你的表是InnoDB类型的。 MyISAM不支持事务。

+0

是的 - 他们是MyISAM,因为他们之间没有任何关系,因此不需要InnoDB – user398341

+0

然后,您必须将其作为两个单独的查询来完成,并且希望它们之间没有任何中断。 InnoDB不仅适用于外键。没有FK,它工作得很好。能够使用交易是切换的一大主要好处 - 唯一“丢失”的是全文索引。 –

+0

谢谢马克 - 不是InnoDB也比MyISAM慢一点?此外,我之前没有使用过事务 - 它们是否在我与表交互时自动执行,或者是否需要使用某些特定语句触发它们?而且 - 当我导出数据库结构时 - 它们是否也导出了,还是需要在导入具有结构的sql后再次定义它们? – user398341

1

根本不可能。做一个单独的DELETE,并将整个事件包装在一个事务中(如果您使用的是支持事务的语言,而不是我不确定支持事务的MYSQL控制台)。

相关问题