Toad for Oracle,将 ID 列编辑为自增 ID
Toad for Oracle, Editing ID Column to be an auto-increment ID
我使用 Toad for Oracle 12.1
处理我的数据库。我有一个名为 TBLEMPLOYEE
的 Table,其中已经包含一些数据,并且有一个名为 ID
的 Column 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
我使用 Toad for Oracle 12.1
处理我的数据库。我有一个名为 TBLEMPLOYEE
的 Table,其中已经包含一些数据,并且有一个名为 ID
的 Column 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