我使用以下查询将行从一个表移动到另一个表:
INSERT INTO `new_table` VALUES (SELECT * FROM `old_table` ORDER BY RAND() LIMIT 0,5)
但是,我移动它后,我需要删除old_table
中的行。是否可以使用与上述类似的查询?
谢谢,
乔尔
答案 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
如果它是数据的子集,那么您需要使用INSERT
跟DELETE
,如果您使用的是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;
或者将其包装为存储过程,函数