INSERT INTO SELECT 实例

本文介绍如何使用MySQL的INSERT...SELECT语法将数据从一个表迁移到另一个表,特别关注当目标表包含固定值列时的数据迁移策略。同时提供两种常见场景的具体实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

     把一个表中特定的2列查询出来,然后插入到另外一张表,插到另一张表的其他列的值是固定值。

要插入的表,插入全部内容时是这样的:

INSERT INTO `mapping_record` (id,mapping_record.type,sim_id,wx_id,created_time,updated_time,is_available) 
VALUES (uuid(),'940ceb86d7c444bd81799edfd4a9beb3','00013543','00013543',1511237080130,NULL,'1')

现在要把sim_id,wx_id从其他表中查询出来,然后其他列按上面的定值,再插入到mapping_record表,sql大致如下:

INSERT INTO `mapping_record` (id,mapping_record.type,sim_id,wx_id,created_time,updated_time,is_available) 
SELECT uuid(),'59e5cb4b0c824adea8adb2a87870875d',soe.fd_keyword AS sim_id,mapping.fd_wid AS wx_id,1511237080130,NULL,'1'
FROM wechat_org_mapping  mapping,sys_org_element soe
where  ...

因为sim_id,wx_id是从其他表中查询出来,连接查询比较复杂,这里就不贴了。但是注意,只要把特殊的列查询出来,指定别名就可以了。


 以下2中从一个表复制插入到另一个表简单的情况

1、如果两个表所有的列都相同,把table1的记录复制到table2:

INSERT INTO table2
SELECT * FROM table1;

2、只复制某一列:

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

我用的是mysql数据库,Oracle也支持这种写法。

### 达梦数据库 `INSERT INTO SELECT` 示例及用法 #### 插入来自另一张表的数据 在达梦数据库中,可以利用 `INSERT INTO SELECT` 语法来高效地将一个表中的数据复制到另一个表里。这种做法非常适合于批量处理以及创建临时工作副本等情况。 ```sql -- 将source_table 表中的所有记录插入到 target_table 中 INSERT INTO target_table (column1, column2, ...) SELECT source_column1, source_column2, ... FROM source_table; ``` 对于更复杂的条件过滤或转换需求,则可以在 `SELECT` 部分加入额外逻辑: ```sql -- 只选择满足特定条件的行并执行插入操作 INSERT INTO target_table (column1, column2, ...) SELECT source_column1, source_column2, ... FROM source_table WHERE condition_expression;[^2] -- 对选定字段应用函数或其他计算后再插入目标表 INSERT INTO target_table (column1, column2, ...) SELECT FUNCTION(source_column1), source_column2 * multiplier, ... FROM source_table; ``` 需要注意的是,在设计此类查询时要确保源表和目的表之间存在兼容性关系;也就是说,所选列的数量及其数据类型应当匹配目标表定义的要求。此外,如果涉及到跨库传输大量数据的话,建议提前评估性能影响,并考虑采用分区交换等优化策略。 #### 实际应用场景实例 假设有一个名为 `orders_archive` 的存档订单表格用于保存历史交易信息,而当前活跃业务则由 `orders_current` 负责管理。为了定期清理过期条目并将它们迁移至长期存储区,可编写如下 SQL 语句: ```sql -- 把一年前已完成状态下的订单转移到档案库 INSERT INTO orders_archive (order_id, customer_name, order_date, status) SELECT o.order_id, c.customer_name, o.order_date, 'ARCHIVED' FROM orders_current AS o JOIN customers AS c ON o.customer_id = c.id WHERE DATEDIFF(CURRENT_DATE(), o.order_date) >= 365 AND o.status = 'COMPLETED'; -- 清除已转移出去的老化记录 DELETE FROM orders_current WHERE EXISTS ( SELECT 1 FROM orders_archive a WHERE a.order_id = orders_current.order_id); ``` 上述脚本不仅实现了从现有活动集合向持久化仓库的安全过渡,还通过删除陈旧项保持了前台系统的精简运作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值