Har*_*ota 2 sql oracle sequence alter oracle11g
我有一个包含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;
Run Code Online (Sandbox Code Playgroud)
在上面的sql语句中,我能够创建一个序列然后更改表并更新它.
由于我需要更新的数据量很大..我希望以尽可能低的成本执行此操作.
我想这样做:
ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT(PERSON_SEQUENCE.NEXTVAL));
Run Code Online (Sandbox Code Playgroud)
但以上不起作用.Oracle向我抛出以下错误:
从第1行开始出错:在命令中输入1 - ALTER TABLE PERSONS ADD(PERSONID NUMBER DEFAULT(PERSON_SEQUENCE.NEXTVAL))错误报告 - ORA-00984:此处不允许使用00984. 00000 - "此处不允许列"*原因:
*操作:
但是这有效:
ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT(0));
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我如何实现更改表(创建新列)并在单个sql中使用seq id填充列.谢谢!
对于具有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;
Run Code Online (Sandbox Code Playgroud)
如果这仍然需要太长时间,请与您的DBA讨论ALTER TABLE NOLOGGING和INSERT /*+ APPEND */和PARALLEL DML.
编辑:啊,是的,对于6千万你甚至可以增加初始分配的序列的缓存大小:
ALTER SEQUENCE PERSON_SEQUENCE CACHE 1000;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1491 次 |
| 最近记录: |