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

Delete and Copy Big Table with Autoincrement

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

我的table是这样的:

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

而不是使用 "delete from MY_TABLE where 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;

问题是:当我创建另一个 table (BCK_MY_TABLE) 时,我丢失了列 MY_ID 上的自动增量。我能做什么?

使用 'create table as select' (CTAS) 没有直接的方法来执行此操作,因为新 table 中的 my_id 将不是标识列,您可以'将现有列变成标识列。

一种方法是使用标识列显式创建 table,复制数据并重置标识值:

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,所以该列已更新 table,然后将其更改为 generated always 以防止进一步更改。)

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