使用自动增量删除和复制大 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
重置它,删除旧的列并重命名新的。
我想从一个大 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
重置它,删除旧的列并重命名新的。