SELECT INTO using Oracle

本文介绍如何将旧表中的数据迁移到新创建的表中,包括直接插入数据和基于旧表记录创建新表的方法。
If NEW_TABLE already exists then ...

insert into new_table select * from old_table
/
If you want to create NEW_TABLE based on the records in OLD_TABLE ...

create table new_table as select * from old_table
/

### Oracle 中 `MERGE INTO ... USING ON` 语法和用法详解 Oracle 数据库中的 `MERGE INTO` 是一种非常强大的 SQL 语句,它允许在一个 SQL 语句中根据源数据对目标表执行插入(INSERT)或更新(UPDATE)操作,有时也被称为“upsert”操作[^2]。该语句特别适用于需要将源表或子查询的数据同步到目标表的场景。 #### 基本语法结构 ```sql MERGE INTO target_table [target_alias] USING source [source_alias] ON (merge_condition) WHEN MATCHED THEN UPDATE SET column1 = value1, column2 = value2, ... [WHERE update_condition] WHEN NOT MATCHED THEN INSERT (column1, column2, ...) VALUES (value1, value2, ...) [WHERE insert_condition]; ``` - **target_table**:要更新或插入的目标表。 - **source**:可以是表、视图或子查询,作为数据源。 - **merge_condition**:用于匹配源数据与目标表数据的条件。 - **WHEN MATCHED**:当匹配条件成立时,对目标表执行更新操作。 - **WHEN NOT MATCHED**:当匹配条件不成立时,向目标表插入新记录。 - 可选的 `WHERE` 子句可用于进一步限制更新或插入的操作范围。 #### 使用示例 假设我们有两个表:`employees_target`(目标表)和 `employees_source`(源表),结构如下: ```sql -- 目标表 CREATE TABLE employees_target ( id NUMBER PRIMARY KEY, name VARCHAR2(50), salary NUMBER ); -- 源表 CREATE TABLE employees_source ( id NUMBER PRIMARY KEY, name VARCHAR2(50), salary NUMBER ); ``` 现在我们要将 `employees_source` 表中的数据合并到 `employees_target` 表中。如果 `id` 匹配,则更新 `salary`;否则插入新的员工记录。 ```sql MERGE INTO employees_target et USING employees_source es ON (et.id = es.id) WHEN MATCHED THEN UPDATE SET et.salary = es.salary WHERE et.salary != es.salary -- 仅当薪资不同才更新 WHEN NOT MATCHED THEN INSERT (id, name, salary) VALUES (es.id, es.name, es.salary); ``` 上述语句实现了以下逻辑: - 如果 `employees_target` 表中存在与 `employees_source` 表中相同的 `id`,则只在 `salary` 不同的情况下更新其工资。 - 如果 `employees_target` 表中没有对应的 `id`,则将来自 `employees_source` 的整条记录插入进去[^3]。 #### 注意事项 1. **锁定风险**:`MERGE INTO` 操作可能会导致行级锁或表级锁,尤其是在高并发环境中,需要注意事务控制和锁竞争问题。 2. **性能优化**:对于大规模数据操作,建议在适当的时候使用索引,并避免在 `ON` 条件中使用复杂的表达式以提高查询效率。 3. **触发器行为**:如果目标表上有定义的 `AFTER UPDATE` 或 `AFTER INSERT` 触发器,它们会在相应的操作发生时被激活。 4. **日志与回滚**:确保数据库处于适当的归档模式,并考虑事务的可回滚性,以便在出现错误时能够恢复数据一致性[^1]。 #### MySQL 中的替代方案 MySQL 在较早版本中并不支持 `MERGE INTO` 语句,但可以通过 `INSERT ... ON DUPLICATE KEY UPDATE` 实现类似功能。例如: ```sql INSERT INTO employees_target (id, name, salary) SELECT id, name, salary FROM employees_source ON DUPLICATE KEY UPDATE salary = VALUES(salary); ``` 此语句会尝试将 `employees_source` 中的所有记录插入到 `employees_target` 中。如果遇到主键或唯一约束冲突(如 `id` 冲突),则执行 `UPDATE` 部分来更新已有记录[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值