在表中添加一个带有序列的新列 - Oracle

时间:2018-06-05 22:26:55

标签: sql oracle oracle11g sequence alter

我有一个包含6000万行数据的表。我想介绍一个新的专栏说" 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(人事号码默认值(PERSON_SEQUENCE.NEXTVAL)) 错误报告 - ORA-00984:这里不允许列 00984. 00000 - "栏目不允许在这里" *原因:
*操作:

然而这有效:

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

是否有人可以帮助我实现如何更改表(创建新列)并在单个sql中使用seq id填充列。谢谢!

2 个答案:

答案 0 :(得分:5)

对于一个有6000万行的表,我不会做一个添加列+插入,而是创建新表:

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;

如果这仍然花费太长时间,请与您的DBA联系ALTER TABLE NOLOGGING以及INSERT /*+ APPEND */PARALLEL DML

编辑:啊,是的,对于6千万你甚至可以增加初始分配的序列的缓存大小:

ALTER SEQUENCE PERSON_SEQUENCE CACHE 1000;

答案 1 :(得分:0)

这对我有用:

更改表PERSONS添加(PERSON_ID编号默认为PERSON_SEQ.nextval);