插入相同 table 时在 Oracle table 中自动递增

Auto-increment in Oracle table when insert in the same table

我有一个 table,我想在向同一个 table.

中插入一行时将一列递增 1

Table users - 当我插入 idusers 的第一行值是 1,第二行值是 2 ....

这是table

用户

    EMAIL primary key
    USERNAME
    PASSWORD
    IDUSER and this the column I want to be AUTO_INCREMENT

我试过这个代码

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10;


create or replace trigger incrementIdUser
    before insert on users
    for each row
    begin
        select seq_person.nextval into :new.IDUSER from users;
    end;

但是当我插入一行时出现错误:

Erreur lors de l'enregistrement des modifications de la table "SOCIAL"."USERS" :
Ligne 1 : ORA-01403: no data found
ORA-01403: no data found
ORA-06512: at "SOCIAL.INCREMENTIDUSER", line 2
ORA-04088: error during execution of trigger 'SOCIAL.INCREMENTIDUSER'
ORA-06512: at line 1

不是那样,但是

create or replace trigger incrementIdUser
  before insert on users
  for each row
begin
    :new.iduser := seq_person.nextval;
end;

您从 users table 编写的 select 代码(它是空的,因此 NO_DATA_FOUND)。如果它包含不止一行,你会得到 TOO_MANY_ROWS(因为你 select 进入一个标量 变量 (:new.iduser) . 最后,存在 突变 table 错误的危险,因为您不能从刚刚被修改的 table select(在此触发器类型中).

而不是 select seq_person.nextval into :new.IDUSER from users; 将序列值分配给 id 用户,您需要使用 :new.IDUSER :=seq_person.nextval;

create or replace trigger incrementIdUser
    before insert on users
    for each row
    begin
         :new.IDUSER :=seq_person.nextval;
    end;

您收到该错误是因为 USERS table 中有零行,所以 SELECT ... FROM USERS return 没有行。

您想要的是使用始终 return 一行的 table(在 Oracle 中,它是 DUAL table):

create or replace trigger incrementIdUser
    before insert on users
    for each row
    begin
        select seq_person.nextval into :new.IDUSER from DUAL;
    end;

或者,更好的解决方案是不使用 SQL 语句并使用纯 PL/SQL:

create or replace trigger incrementIdUser
    before insert on users
    for each row
    begin
        :new.IDUSER := seq_person.nextval;
    end;

您应该在创建 table 语句中使用标识列,而不是使用触发器:

create table users
(iduser integer generated by default on null as identity (nomaxvalue nocache order),
 ...);