我有两个具有相同结构的表,两个表都包含auto_increment
的ID字段。
我想从一张桌子到另一张桌子上移动一行。
我知道我可以使用:
INSERT INTO `new_table` VALUES (SELECT * FROM `old_table`)
但是,new_table
中的ID会收到old_table
的ID。所以我基本上想要复制除ID之外的所有字段,这需要获得auto_increment
new_table
的值{{1}}。我怎么能这样做?
谢谢!
乔尔
修改
对不起,我应该在我的原帖中提到 - 我想要一种方法来完成它而不是专门选择每个字段,主要是因为我有很多字段......我正在寻找更通用的方法。
谢谢!
答案 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列