[英]Add a new column in table with a sequence - Oracle
我有一个包含 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 (PERSONID NUMBER DEFAULT(PERSON_SEQUENCE.NEXTVAL)) 错误报告 -
ORA-00984:此处不允许使用列 00984. 00000 - “此处不允许使用列” *原因:
*行动:
但是这有效:
ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT(0));
有人可以帮助我如何实现更改表(创建一个新列)并在单个 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;
如果这仍然需要很长时间,请与您的 DBA 讨论ALTER TABLE NOLOGGING
和INSERT /*+ APPEND */
和PARALLEL DML
。
编辑:啊,是的,对于 6000 万,您甚至可以增加初始分配序列的缓存大小:
ALTER SEQUENCE PERSON_SEQUENCE CACHE 1000;
这对我有用:
更改表 PERSONS 添加(PERSON_ID 号默认为 PERSON_SEQ.nextval);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.