Toad for Oracle,编辑ID列为自动增量ID

时间:2016-02-17 04:05:15

标签: oracle toad

我使用Toad for Oracle 12.1为我的数据库工作。我有一个名为TBLEMPLOYEE的表,其中已包含一些数据,并且Column Name名为ID,其数据值从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

enter image description here

Toad会显示一系列设置的用户界面:

enter image description here

并将自动翻译为:

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

Default / Virtual / Identity设置中。

但是当我Alter Table代替Create Table时,我似乎无法做同样的事情。

enter image description here

为什么会这样?

由于TBLEMPLOYEE中已有一些数据,我想避免创建新表并尽可能重新插入数据。

我该怎么做?

这是当前的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);

1 个答案:

答案 0 :(得分:0)

首先,您的序列应以表格中的最大值+ 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