如何将一表列值赋给另一表列?复制表并新增列赋值实现
搞定复制表+列赋值的完整SQL方案
嘿,我来帮你把这个需求的完整实现梳理清楚,结合你给出的部分语句,咱们一步步来:
1. 先把源表的结构和数据复制到新表
首先用你给出的语句,把users表的结构复刻成users_history,再把源表的数据全部导入进去:
-- 复制users表的结构到users_history CREATE TABLE db_portal.users_history LIKE db_portal.users; -- 将users表的所有数据插入到新表 INSERT INTO db_portal.users_history SELECT * FROM db_portal.users;
2. 调整新表结构:加新列、改主键和引擎
接下来咱们完成新表的结构改造——添加你需要的action、revision等列,同时调整主键约束和存储引擎,我把你没写完的语句补全了,你可以根据实际需求修改参数:
ALTER TABLE db_portal.users_history MODIFY COLUMN id int(11) NOT NULL, DROP PRIMARY KEY, ENGINE = MyISAM, ADD action VARCHAR(8) DEFAULT 'insert' FIRST, ADD revision INT(6) NOT NULL DEFAULT 1 AFTER action;
这里给revision加了默认值1,你要是有其他需求直接修改就行。
3. 把源表的列值同步到新表的新增列
如果需要把users表中的某一列(比如created_at创建时间)的值,赋值到users_history的某个新增列(比如record_time记录时间),咱们可以用关联更新的方式来实现,先加列再同步:
-- 先新增record_time列(如果之前没加的话) ALTER TABLE db_portal.users_history ADD record_time DATETIME AFTER revision; -- 关联两张表,把users的created_at同步到users_history的record_time UPDATE db_portal.users_history uh JOIN db_portal.users u ON uh.id = u.id SET uh.record_time = u.created_at;
这里用id作为关联条件,是假设两张表的id是一一对应的,你要是有其他关联键(比如唯一标识的用户名),替换成对应的字段就行。
几个要注意的小细节
- 执行
DROP PRIMARY KEY之前,要确认新表确实不需要保留原主键约束,MyISAM引擎下这个操作不会丢数据,但得符合你的业务逻辑。 - 新增列的默认值要贴合业务,比如
action默认设为insert,刚好对应初始的数据导入操作。 - 执行UPDATE语句的时候,建议先在测试环境跑一遍验证结果,避免误改生产数据。
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

