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

标签 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 向我抛出以下错误:

Error starting at line :

1 in command - ALTER TABLE PERSONS ADD (PERSONID NUMBER DEFAULT(PERSON_SEQUENCE.NEXTVAL)) Error report -

ORA-00984: column not allowed here 00984. 00000 - "column not allowed here" *Cause:
*Action:



但是这有效:
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 NOLOGGINGINSERT /*+ APPEND */PARALLEL DML .

编辑:啊,是的,对于 6000 万,您甚至可以增加初始分配序列的缓存大小:
ALTER SEQUENCE PERSON_SEQUENCE CACHE 1000;

关于sql - 在表中添加一个带有序列的新列 - Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50709796/

相关文章:

MySQL COUNT 和合并重复记录

mysql - 如何删除数据库表中的所有重复项而不保留其中的任何一个?

sql - 在sql server中使用自引用

node.js - 如何在 Node.js 中将 {In} 列表添加到 Oracle DB 查询 "WHERE IN"子句

sql - Oracle 查询优化一个棘手的删除查询

mysql - 莫名其妙的内部查询

java - Oracle 中是否不推荐使用 RAW 类型?

sql - 查询仅获取某个人的行

java - 从 Oracle SQL 查询中获取结果

sql - 对 xmlagg(xmlelement(...) 的结果进行排序