Добавить новый столбец в таблице с последовательностью - Oracle - PullRequest
0 голосов
/ 06 июня 2018

У меня есть таблица с 60 миллионами строк данных.Я хотел бы ввести новый столбец с именем «id» для таблицы, которая представляет собой автоматически увеличенную последовательность.

Например:

CREATE TABLE Persons (
    LastName varchar(255),
    FirstName varchar(255)
);

INSERT INTO Persons VALUES ('abc', 'def');
INSERT INTO Persons VALUES ('abcd', 'ghi');

CREATE SEQUENCE "PERSON_SEQUENCE" START WITH 1 INCREMENT BY 1;

ALTER TABLE PERSONS ADD (PERSONID NUMBER);

UPDATE persons SET personid = PERSON_SEQUENCE.NEXTVAL;

В приведенных выше инструкциях sql я могусоздайте последовательность, затем измените таблицу и обновите ее.

Поскольку объем данных, которые мне нужно обновить, велик ... Я хотел бы выполнить это с как можно более низкой стоимостью.

Я пытаюсь сделать что-то вроде этого:

ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT(PERSON_SEQUENCE.NEXTVAL));

, но выше не работает.Oracle выдает мне следующую ошибку:

Ошибка запуска в строке: 1 в команде - ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT (PERSON_SEQUENCE.NEXTVAL)) Отчет об ошибке - ORA-00984: столбец здесь недопустим 00984. 00000- «столбец здесь не разрешен» * Причина:
* Действие:

Однако это работает:

ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT(0));

Может кто-нибудь помочь мне с тем, как я могу добиться, чтобы изменить таблицу (создать новый столбец) и заполнить столбец с seq id как в одном sql.Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Это сработало для меня:

изменить таблицу PERSONS add (номер PERSON_ID по умолчанию PERSON_SEQ.nextval);

0 голосов
/ 06 июня 2018

Для таблицы с 60 миллионами строк я бы не стал добавлять столбец + вставку, а создал бы новую таблицу:

RENAME persons TO persons_old;

CREATE TABLE Persons (
  personid   number,
  LastName   varchar(255),
  FirstName  varchar(255)
); 

INSERT INTO persons (personid, lastname, firstname)
SELECT person_sequence.nextval, lastname, firstname
  FROM persons_old;

DROP TABLE persons_old;

Если это все еще занимает слишком много времени, поговорите с администратором базы данных о ALTER TABLE NOLOGGING и INSERT /*+ APPEND */ и PARALLEL DML.

РЕДАКТИРОВАТЬ: Ах, да, за 60 миллионов вы могли бы даже увеличить размер кэша последовательности для начального назначения:

ALTER SEQUENCE PERSON_SEQUENCE CACHE 1000;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...