2011-01-05 58 views
0

我有两个具有相同结构的表,并且都包含一个ID字段auto_increment。 我想从一个表格移动到另一个表格。在MySQL表之间移动行

我知道我可以使用:

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

但这种方式在new_table的ID将获得old_table的ID。所以我基本上想复制除ID以外的所有字段,这需要auto_increment的值为new_table。我怎样才能做到这一点?

谢谢!

乔尔


编辑:

对不起,我应该在我原来的帖子中提到的 - 我想一个办法做到这一点不明确选择每个领域,主要是因为我有一个很多领域...我正在寻找更通用的方法。

谢谢!

+0

哇!一分钟内完全相同的回复!要开心。 :) – Nishant 2011-01-05 07:24:26

+0

呵呵,这是我的不好,我应该提到我在我原来的帖子中寻找一个通用的方法...我现在编辑它 – Joel 2011-01-05 07:43:45

回答

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的字段名称。

+0

谢谢,可能更好地做你的方式! – Joel 2011-01-05 07:52:25

1

不要在这种情况下,选择ID:

INSERT INTO `new_table` (`field2`, `field3`) VALUES (SELECT `field2`, `field3` FROM `old_table`) 
0
INSERT INTO `new_table` (COLS-I-WANT) 
VALUES (SELECT (OLD-COLS-I-WANT) FROM `old_table`) 

希望这有助于。

0

指定INSERT列表和SELECT列表中不包含ID列的列名称