如何复制表中除应更改的单个列之外的所有数据

Posted

技术标签:

【中文标题】如何复制表中除应更改的单个列之外的所有数据【英文标题】:How to duplicate all data in a table except for a single column that should be changed 【发布时间】:2010-04-23 07:17:21 【问题描述】:

我有一个关于针对具有不同数据的表的统一插入查询的问题 结构(甲骨文)。让我用一个例子来详细说明:

    tb_customers (
    id NUMBER(3), name VARCHAR2(40), archive_id NUMBER(3)
    )

    tb_suppliers (
    id NUMBER(3), name VARCHAR2(40), contact VARCHAR2(40), xxx, xxx, 
    archive_id NUMBER(3)
    )

所有表中唯一存在的列是 [archive_id]。计划是通过将所有记录复制(复制)到不同的数据库分区并相应地增加这些记录的 archive_id 来创建数据集的新存档。 [archive_id] 始终是主键的一部分。

我的问题是使用 select 语句来进行数据的实际复制。因为列是可变的,所以我很难想出一个统一的选择语句来复制数据并更新archive_id。

一种解决方案(可行)是遍历存储过程中的所有表并执行以下操作:

CREATE TABLE temp as (SELECT * from ORIGINAL_TABLE);
UPDATE temp SET archive_id=something;
INSERT INTO ORIGINAL_TABLE (select * from temp);
DROP TABLE temp;

我不太喜欢这种解决方案,因为 DDL 命令会破坏所有还原点。

还有其他人有解决办法吗?

【问题讨论】:

我认为您的示例 sql 的倒数第二行应该是:INSERT INTO TARGET_TABLE (select * from temp); ty 指出这一点,已修复 【参考方案1】:

为每个基表创建一个全局临时表怎么样?

create global temporary table tb_customers$ as select * from tb_customers;
create global temporary table tb_suppliers$ as select * from tb_suppliers;

您不需要每次都创建和删除这些,只需保持原样即可。

你的存档过程是一个单一的交易......

insert into tb_customers$ as select * from tb_customers;
update tb_customers$ set archive_id = :v_new_archive_id;
insert into tb_customers select * from tb_customers$;

insert into tb_suppliers$ as select * from tb_suppliers;
update tb_suppliers$ set archive_id = :v_new_archive_id;
insert into tb_suppliers select * from tb_suppliers$;

commit; -- this will clear the global temporary tables

希望这会有所帮助。

【讨论】:

【参考方案2】:

我建议不要对所有表都使用一条 sql 语句,而只是使用和插入。

insert into tb_customers_2 
    select id, name, 'new_archive_id' from tb_customers;
insert into tb_suppliers_2 
    select id, name, contact, xxx, xxx, 'new_archive_id' from tb_suppliers;

或者,如果你真的需要一个 sql 语句,至少预先创建所有临时表(作为临时表)并将它们留在原处以备下次使用。然后就用动态sql来引用临时表。

insert into ORIGINAL_TABLE_TEMP (SELECT * from ORIGINAL_TABLE);
UPDATE ORIGINAL_TABLE_TEMP SET archive_id=something;
INSERT INTO NEW_TABLE (select * from ORIGINAL_TABLE_TEMP);

【讨论】:

以上是关于如何复制表中除应更改的单个列之外的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

更新 Access 2013 中除标识列之外的所有行

如何使用 MySQL 查询从表中选择除一列之外的所有内容? [复制]

在同一个表中复制数据并同时更新列的最佳方法

SQL Server:复制表中的列

在EXCEL中用VBA操作WORD表格:怎样选择一个表格中除第一行以外的任意连续行(比如第2到4行)?

小写数据框中除 xyz 之外的所有字符列