Oracle:如何创建一个身份列?
Oracle:如何创建一个身份列?
看起来Oracle直到11g版本还没有AUTO_INCREMENT的概念。
我该如何在Oracle 11g中创建一个行为类似自增的列?
admin 更改状态以发布 2023年5月23日
SYS_GUID
返回一个GUID-一个全局唯一标识符。一个SYS_GUID
是一个RAW(16)
。它不生成一个递增的数字值。
如果你想创建一个递增的数字键,你需要创建一个序列。
CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
然后你可以在你的INSERT
语句中使用该序列
INSERT INTO name_of_table( primary_key_column, <> ) VALUES( name_of_sequence.nextval, < > );
或者你可以定义一个触发器,自动使用序列填充主键值
CREATE OR REPLACE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW BEGIN SELECT name_of_sequence.nextval INTO :new.primary_key_column FROM dual; END;
如果你使用的是Oracle 11.1或更高版本,可以简化触发器
CREATE OR REPLACE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW BEGIN :new.primary_key_column := name_of_sequence.nextval; END;
如果你真的想使用SYS_GUID
CREATE TABLE table_name ( primary_key_column raw(16) default sys_guid() primary key, <> )
截至Oracle 11g,"auto_increment"或"identity"列在Oracle中不存在。但是,您可以通过序列和触发器轻松地进行建模:
表定义:
CREATE TABLE departments ( ID NUMBER(10) NOT NULL, DESCRIPTION VARCHAR2(50) NOT NULL); ALTER TABLE departments ADD ( CONSTRAINT dept_pk PRIMARY KEY (ID)); CREATE SEQUENCE dept_seq START WITH 1;
触发器定义:
CREATE OR REPLACE TRIGGER dept_bir BEFORE INSERT ON departments FOR EACH ROW BEGIN SELECT dept_seq.NEXTVAL INTO :new.id FROM dual; END; /
更新:
IDENTITY
列现在在Oracle 12c上提供:
create table t1 ( c1 NUMBER GENERATED by default on null as IDENTITY, c2 VARCHAR2(10) );
或者指定起始和递增值,还可以防止插入到标识列中(GENERATED ALWAYS
)(仅适用于Oracle 12c+)
create table t1 ( c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1), c2 VARCHAR2(10) );
另外,Oracle 12还允许使用序列作为默认值:
CREATE SEQUENCE dept_seq START WITH 1; CREATE TABLE departments ( ID NUMBER(10) DEFAULT dept_seq.nextval NOT NULL, DESCRIPTION VARCHAR2(50) NOT NULL); ALTER TABLE departments ADD ( CONSTRAINT dept_pk PRIMARY KEY (ID));