如何将单条表数据复制到另一表并修改ID值(示例ID改为20)
解决方法:复制行并修改目标ID
你的当前语句INSERT INTO work_done SELECT * FROM work_todo WHERE id = 10会直接把原行的id=10复制到work_done表中,没法实现将目标ID改为20的需求。这里有两种靠谱的解决方式:
方式一:明确指定所有字段(推荐)
这种方法最清晰,也能避免因表结构变化导致的潜在问题。你需要列出work_done表的所有字段,然后在SELECT语句中将id字段替换为20,其他字段沿用原表的值:
INSERT INTO work_done (id, field1, field2, field3, ...) SELECT 20, field1, field2, field3, ... FROM work_todo WHERE id = 10;
把上面的field1、field2等替换成work_todo和work_done表中实际的字段名即可。注意要保证两边的字段顺序和数量完全匹配。
方式二:动态排除ID字段(适合字段较多的场景)
如果表的字段非常多,不想逐个列出,可以用子查询或数据库特定语法排除原ID,再手动指定新ID:
以MySQL为例:
INSERT INTO work_done SELECT 20, t.* FROM ( SELECT field1, field2, field3, ... -- 列出除id外的所有字段 FROM work_todo WHERE id = 10 ) t;
以PostgreSQL为例:
利用WITHOUT COLUMN语法直接排除原ID字段:
INSERT INTO work_done SELECT 20, (work_todo.*)::work_todo WITHOUT COLUMN id FROM work_todo WHERE id = 10;
注意事项:
- 如果
work_done的id是自增主键,需要确保20这个ID值未被占用,否则会触发主键冲突错误。部分数据库可能需要临时关闭自增约束(比如MySQL执行SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';)才能手动插入指定ID。 - 优先推荐方式一,因为它的可读性和稳定性更强,后续表结构变更时更容易维护。
内容的提问来源于stack exchange,提问作者Martin54
相关产品推荐
相关产品推荐

