我有一个包含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填充列。谢谢!
答案 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);