插入相同 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),
...);
我有一个 table,我想在向同一个 table.
中插入一行时将一列递增 1Table 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),
...);