我想从一个大表中删除很多行(超过一百万)。
我的桌子是这样的:
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列上丢失了自动增量。我该怎么办?
答案 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
重置它,删除旧的列并重命名新的列。