Удалить и скопировать большой стол с автоинкрементом - PullRequest
0 голосов
/ 22 сентября 2018

Я хочу удалить много строк (более миллиона) из большой таблицы.

Моя таблица выглядит так:

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, где 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 голосов
/ 23 сентября 2018

Не существует простого способа сделать это с помощью «создать таблицу как выбор» (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, удалите старый столбец и переименуйте новый.

...