Oracle:如何创建一个身份列?

21 浏览
0 Comments

Oracle:如何创建一个身份列?

看起来Oracle直到11g版本还没有AUTO_INCREMENT的概念。

我该如何在Oracle 11g中创建一个行为类似自增的列?

admin 更改状态以发布 2023年5月23日
0
0 Comments

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,
  <>
)

0
0 Comments

截至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));

0