2009-12-04 9 views
1

J'ai deux tables:insertion de la table de base de données Oracle

create table Number(num number(5)); 

create table Entry(id number(3), name varchar(50)); 

Comment puis-je augmenter le champ num de la table Nombre de Oracle chaque fois que j'insérer quelque chose dans la table d'entrée?

+0

Souhaitez-vous que le champ Nombre.num indique le nombre total d'entrées dans la table Entrée? Si tel est le cas, alors une séquence n'est pas ce que vous voulez. Les séquences assurent seulement une valeur unique. –

Répondre

8

Vous devez utiliser un SEQUENCE à la place. La table "Number" est une idée intrinsèquement mauvaise, car lorsque deux sessions insèrent des lignes simultanément, chaque session voit uniquement la valeur non-validée dans la table Number.

C'est ce que vous devez faire à la place:

create sequence entrySeq; 

create table Entry(id number(3), name varchar(50)); 

create trigger tr_entry before insert on Entry for each row 
begin 
    select entrySeq.nextval into :new.number from dual; 
end; 
/
+1

Voilà pourquoi il y a des séquences dans Oracle .. utilisez-les! (Ou évitez de les utiliser à vos risques et périls.) – Thorsten

2

Voulez-vous que number.num représente continuellement le nombre de lignes dans la table d'entrée? Si oui, vous pouvez simplement le définir comme une vue:

create view number_view 
as 
select count(*) from Entry 
+0

D'accord. Je ne pense pas que la relation entre les deux tables ait été entièrement expliquée par le PO. –

0
create sequence entrySeq; 

create table Entry(id number(3), name varchar(50)); 

insert into Entry value (entrySeq.nextval, 'MyName'); 

(Vous n'avez pas besoin d'un déclencheur). Une séquence renvoie une valeur numérique unique et croissante, mais Oracle ne garantit pas qu'elle est sans intervalle. Lorsque parfois les transactions sont annulées, les valeurs de l'identifiant de la colonne contiennent des espaces.

Questions connexes