Oracle触发器创建自动编号

Mik*_*ike 12 oracle triggers plsql

我之前从未在Oracle中创建过触发器,因此我正在寻找一些方向.

我想创建一个触发器,如果​​ID不在insert语句中,则将ID递增1.

ID应该从10000开始,并且当插入记录时,下一个ID应该是10001.如果insert语句包含ID,它应该覆盖自动增量.

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

firstname姓氏ID

Micahel Jordan 10000

拉里伯德10001

insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000)
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

firstname姓氏ID

Micahel Jordan 10000

拉里伯德10001

Scottie Pippen 50000

Jus*_*ave 27

这样的东西适用于11g

CREATE SEQUENCE t1_id_seq 
  start with 10000 
  increment by 1;

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    :new.id := t1_id_seq.nextval;
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是早期版本,则需要执行SELECT INTO以从序列中获取下一个值

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    SELECT t1_id_seq.nextval
      INTO :new.id
      FROM dual;
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

请注意,Oracle序列不是无间隙的.因此,出于各种原因,完全有可能跳过特定值.您的第一个插入可能具有10000的ID,如果它在几分钟,几小时或几天后完成,则第二个插入的ID可能为10020.

另外,请注意Oracle不支持像MySQL那样在VALUES子句中指定多行.所以而不是

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
Run Code Online (Sandbox Code Playgroud)

你需要两个单独的INSERT语句

insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');
Run Code Online (Sandbox Code Playgroud)