2016-02-17 4 views
1

Я работаю с Toad for Oracle 12.1 моей моей базой данных. У меня есть таблица под названием TBLEMPLOYEE, которые уже содержат некоторые данные в нем и, Column Name называется ID, чьи данные значения увеличиваются от 1 до N.Жаба для Oracle, Редактирование ID Столбец для автоинкремента ID

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 таким образом, что она будет иметь автоинкрементным ID, когда я добавляю новые данные в Table.

Я знаю, что в жабе мы можем это сделать, когда создадим 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); 

ответ

0

Прежде всего, ваша последовательность должна начинаться с максимальным значением +-из таблицы, например,

(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

+0

Я пробовал ваше предложение, но я получил следующую ошибку - любую идею? ALTER TABLE MYSCHEMA.TBLEMPLOYEE ИЗМЕНИТЬ (ID DEFAULT (НАЧАТЬ С 7 Инкримент 1 MINVALUE 1 MAXVALUE 9999999999999999999999999999 CACHE 20 NOCYCLE ORDER NOKEEP)) Ошибка в строке 3 ORA-00936: отсутствует выражение – Ian

+0

Я думаю, что то, что вы хотите сделать, это переопределить последовательность , Для этого вам, вероятно, следует воссоздать последовательность https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm#i2067093 –

+0

Вот что я * не * хочу делать на самом деле. .. Если возможно, я хочу сохранить текущие данные неповрежденными ... :(см. Мой вопрос: «И поскольку у меня уже есть некоторые данные в TBLEMPLOYEE, я хочу избежать создания новой таблицы и повторной установки данных, если возможно . " – Ian

Смежные вопросы