【发布时间】:2017-09-16 17:46:17
【问题描述】:
例子:
表_A
id | not null | number(10)
name | not null | varchar(50)
photo | not null | blob
如果我想从表A中删除列photo的blob数据
我的表包含大约 2,000,000 行,因此执行 UPDATE 语句变得很耗时。
我的做法:
CREATE DIRECTORY EXT_DIR as '/tmp/TEST/';
CREATE TABLE TABLE_TEMP
(
ID varchar2(10),
NAME varchar2(50)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY EXT_DIR
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
ID char(10),
NAME char(50)
)
)
LOCATION ('TABLE_A.csv') ---dump taken from TABLE_A
)
REJECT LIMIT UNLIMITED;
/
INSERT INTO TABLE_A(ID,NAME) SELECT ID,NAME FROM TABLE_TEMP;
我的方法是将表数据放入 CSV 并使用 EXTERNAL TABLE 将 CSV 数据插入到我的表中,但由于 CSV 最多只能存储 1048576 行,因此寻找不同的方法。
【问题讨论】:
-
你试过什么? SO 不适用于操作方法问题,因此您应该进行一些搜索,尝试一些东西,然后,如果您仍然需要帮助,请发布问题
-
好的,请注意!首先,我的表包含大约 20 行 lac 行,因此执行
UPDATE语句变得很耗时。我的方法是将表数据放入 CSV 并使用 EXTERNAL TABLE 将 CSV 数据插入到我的表中,但 CSV 最多可以存储 1048576 行。 -
如果您可以执行 DDL 语句,请删除该列,然后重新添加。但是列上的 NOT NULL 约束呢?
-
我可以从该列中删除 NOT NULL 但使用 DDL 会更改我的表结构。
-
表上是否有需要保留的触发器等?原则上,创建一个与现有表具有相同结构(列名和数据类型)的空表是最简单的;
create table table_temp as select * from table_a where 0 = 1是一种常用的方法。然后insert into table_temp select id, name, NULL from table_a。然后删除table_a并将table_temp重命名为table_a。您将不得不重新创建索引和触发器等,但这应该是快速和简单的。