在MySQL表之间移动和删除行

时间:2011-01-06 13:59:39

标签: mysql sql

我使用以下查询将行从一个表移动到另一个表:

INSERT INTO `new_table` VALUES (SELECT * FROM `old_table` ORDER BY RAND() LIMIT 0,5)

但是,我移动它后,我需要删除old_table中的行。是否可以使用与上述类似的查询?

谢谢,

乔尔

2 个答案:

答案 0 :(得分:1)

<强>更新

插入数据的子集时,如果使用的是InnoDB,则需要使用INSERT DELETE,将其包装在事务中,以便操作是原子的。

使用ORDER BY RAND()您会遇到一个重大问题,因为您不知道哪些行已被删除。可能需要一个用于存储目标行的临时表。

BEGIN TRANSACTION;

CREATE TEMPORARY TABLE `target_keys`
    SELECT `id` FROM `old_table` ORDER BY RAND() LIMIT 0,5;

INSERT INTO `new_table` VALUES
    (SELECT * FROM `old_table` WHERE `id` IN (SELECT `id` FROM `target_keys`));

DELETE FROM `old_table` WHERE `id` IN (SELECT `id` FROM `target_keys`);

DROP TABLE `target_keys`;

COMMIT;

预编辑答案

如果您要移动示例中的所有行,为什么不只是rename the table

RENAME TABLE old_name TO new_name

如果它是数据的子集,那么您需要使用INSERTDELETE,如果您使用的是InnoDB,请将其包装在事务中,以便操作是原子的。

答案 1 :(得分:1)

别无选择

alter table old_table add column selected int(1) not null default 0;
update old_table set selected=1 order by rand() limit 5;
insert into new_table select * from old_table where selected=1;
delete from old_table where selected=1;

或者将其包装为存储过程,函数