在MySQL表之间移动行

时间:2011-01-05 07:17:59

标签: mysql sql

我有两个具有相同结构的表,两个表都包含auto_increment的ID字段。 我想从一张桌子到另一张桌子上移动一行。

我知道我可以使用:

INSERT INTO `new_table` VALUES (SELECT * FROM `old_table`)

但是,new_table中的ID会收到old_table的ID。所以我基本上想要复制除ID之外的所有字段,这需要获得auto_increment new_table的值{{1}}。我怎么能这样做?

谢谢!

乔尔


修改

对不起,我应该在我的原帖中提到 - 我想要一种方法来完成它而不是专门选择每个字段,主要是因为我有很多字段......我正在寻找更通用的方法。

谢谢!

4 个答案:

答案 0 :(得分:3)

INSERT INTO `new_table` (name, surname, email) 
  (SELECT name, email, surname FROM `old_table`);

在让MySQL自动分配新ID时要小心,以防其他表与您需要移动时有关系。

在这种情况下,我将通过向ID添加已知偏移量来移动整个数据,该偏移量将足够大以避免目标表中的ID冲突。由于偏移是已知的,因此当从其他表移动关系(到目标表)时,我将能够应用相同的偏移量。

根据问题编辑进行编辑:我强烈建议避免使用“通用方法”。编写所有字段似乎很迂腐,但这是避免错误的唯一方法,当然还有ID碰撞问题。如果你想避免输入字段名(因为它很无聊且容易出错),你可以复制粘贴来自show create table new_table的字段名。

答案 1 :(得分:1)

在这种情况下不要选择id:

INSERT INTO `new_table` (`field2`, `field3`) VALUES (SELECT `field2`, `field3` FROM `old_table`)

答案 2 :(得分:0)

INSERT INTO `new_table` (COLS-I-WANT) 
VALUES (SELECT (OLD-COLS-I-WANT) FROM `old_table`)

希望这有帮助。

答案 3 :(得分:0)

指定INSERT列表和SELECT列表中的列名,不包括ID列