使用自动增量删除和复制大表

时间:2018-09-22 17:18:24

标签: sql oracle ddl

我想从一个大表中删除很多行(超过一百万)。

我的桌子是这样的:

Create table MY_TABLE (
MY_ID           NUMBER GENERATED BY DEFAULT AS IDENTITY (Start with 1) primary key,
PROCESS         NUMBER,
INFORMATION     VARCHAR2(100)
);

而不是使用“从MY_TABLE的PROCESS = 3删除”

我这样做:

CREATE TABLE BCK_MY_TABLE AS (SELECT * FROM MY_TABLE WHERE PROCESS <> 3);
DROP TABLE MY_TABLE;
RENAME BCK_MY_TABLE to MY_TABLE;

问题是:当我创建另一个表(BCK_MY_TABLE)时,我在MY_ID列上丢失了自动增量。我该怎么办?

1 个答案:

答案 0 :(得分:0)

使用“创建表为选择表”(CTAS)并没有直接的方法,因为新表中的my_id不会是标识列,并且您无法创建现有列进入身份列。

一种方法是显式地创建带有标识列的表,复制数据并重置标识值:

create table bck_my_table
( my_id           number generated by default as identity primary key
, process         number
, information     varchar2(100) );

insert into bck_my_table (my_id, process, information)
select my_id, process, information from my_table;

alter table bck_my_table
modify my_id generated always as identity start with limit value;

(我们必须使用generated by default,以便该列是可更新的,然后将其更改为generated always,以防止进一步的更改。)

另一种方法是使用CTAS复制表,然后添加新的标识列,从旧的my_id更新它,使用start with limit value重置它,删除旧的列并重命名新的列。