Toad for Oracle,将 ID 列编辑为自增 ID

Toad for Oracle, Editing ID Column to be an auto-increment ID

我使用 Toad for Oracle 12.1 处理我的数据库。我有一个名为 TBLEMPLOYEE 的 Table,其中已经包含一些数据,并且有一个名为 IDColumn Name,其数据值从 1 增加到 N。

ID  Name    Gender  DateOfBirth Type
------------------------------------
1   Mark    Male    10/10/1982  1
2   Mary    Female  11/11/1981  2
3   Esther  Female  12/12/1984  2
4   Matthew Male    9/9/1983    1
5   John    Male    5/5/1985    1
6   Luke    Male    6/6/1986    1

现在我想更改 Column ID,以便在我向 Table 添加新数据时它具有自动递增的 ID。

我知道在 Toad 中,当我们创建具有该行为的 New Table 时,我们可以做到这一点。例如,使用 Create Table 并在新创建的 Column 中,我们可以将 Default / Virtual / Identity 设置为 Identity:

并且 Toad 将显示一个 UI 以及一系列设置:

并且会自动翻译成如下内容:

(START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999999999999999999999 CACHE 20 NOCYCLE ORDER NOKEEP)

Default / Virtual / Identity设置中。

但是当我使用 Alter Table 而不是 Create Table 时,我似乎无法做到同样的事情。

为什么会这样?

并且因为我已经在 TBLEMPLOYEE 中有一些数据,所以我想避免创建一个新的 table 并尽可能地重新插入数据。

我该怎么做?

这是当前的 SQL 脚本(如果这可能有帮助的话):

ALTER TABLE MYSCHEMA.TBLEMPLOYEE
 DROP PRIMARY KEY CASCADE;

DROP TABLE MYSCHEMA.TBLEMPLOYEE CASCADE CONSTRAINTS;

CREATE TABLE MYSCHEMA.TBLEMPLOYEE
(
  ID            NUMBER                          NOT NULL,
  NAME          VARCHAR2(80 BYTE)               NOT NULL,
  GENDER        VARCHAR2(6 BYTE),
  DATEOFBIRTH   DATE,
  EMPLOYEETYPE  INTEGER                         NOT NULL,
)
TABLESPACE USERS
RESULT_CACHE (MODE DEFAULT)
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;

ALTER TABLE MYSCHEMA.TBLEMPLOYEE ADD (
  PRIMARY KEY
  (ID)
  USING INDEX
    TABLESPACE USERS
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MAXSIZE          UNLIMITED
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               )
  ENABLE VALIDATE);

首先,您的序列应从 table 中的最大值 + 1 开始,例如

(START WITH 7 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999999999999999999999 CACHE 20 NOCYCLE ORDER NOKEEP)

如果您想自动填充 Id 的值并且您不是 运行 在 Oracle 12c 上,我建议您使用触发器

drop sequence seq_mytest_id;

truncate table my_test_t;

drop table my_test_t;

create table my_test_t (id number, string varchar2(30));

-- prepopulate with fixed values for the id
insert into my_test_t(id, string) values (1,'test');
insert into my_test_t(id, string) values (2,'test');
insert into my_test_t(id, string) values (3,'test');
insert into my_test_t(id, string) values (4,'test');
insert into my_test_t(id, string) values (5,'test');
insert into my_test_t(id, string) values (6,'test');

commit;

--Now create the sequence and the trigger for automatically 
--populating the ID column
create sequence seq_mytest_id start with 7 increment by 1 nocycle nocache;

create trigger t_mytest_bi before insert on  my_test_t for each row
begin
  select seq_mytest_id.nextval into :new.id from dual;
end;
/

-- Test the trigger
insert into my_test_t(string) values ('test');

insert into my_test_t(string) values ('test2');


commit;

select * from my_test_t;

如果您 运行 使用 Oracle 12c,您可以将您的列定义为标识列

https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1

希望对您有所帮助, R