Link Station > Section Technique > Software >

[CONSEIL] clé autoincrémentée sous oracle




Aller au Forum:
Notez ce sujet :

  Sujet précédent   Sujet suivant
Auteur
Sujet    Tout développer | Tout contracter NOUVEAU SUJET    RÉPONDRE
Réduire ce messageGgiseleNewbieNiveau 2 · Spectateur
Membre depuis
2003
Messages
18
Plus
Membre n°
13084
Inscription
27 Jul 2003
Âge
54 ans
Sujets lancés
5
Ancienneté
95 %
Participation
6 %
[CONSEIL] clé autoincrémentée sous oracleAncien message 28-10-2003 09:03
salut tous, oracle ne proposant pas l'autoincrémentation pour les clés primaires, il parait qu'il faut creer un generateur qu'on pourra solliciter avec un trigger.
quelqu'un sait comme,nt on le fait ce generateur sous oracle?

__________________

il n'y a pas de sotte existence

Edité par Maousse le 28-10-2003 à 09:42

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageSshakes808080GuruNiveau 27 · FigurantRéférenceur Appliqué
Membre depuis
2002
Messages
8978
Plus
Membre n°
517
Inscription
08 Mar 2002
Sujets lancés
354
Ancienneté
100 %
Participation
91 %
Ancien message 28-10-2003 09:37
<!-- [msg_moderateur] --> Merci de t'en tenir à la liste des tags autorisés.


Je ne connais pas la notion d'autoincrémentation sous oracle. En tout cas pas sous oracle 8. C'est qqchose qui débarque avec la v9 ?

__________________
Racket logiciel

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageMMaousseGuruNiveau 25 · Chef opérateurRéférenceur Novice
Membre depuis
2002
Messages
15626
Plus
Membre n°
1121
Inscription
14 Apr 2002
Sujets lancés
211
Ancienneté
100 %
Participation
100 %
Ancien message 28-10-2003 09:37
Bonjour Gisèle.

Change le TAG pour [CONSEIL] STP, ton titre peut être changé en [CONSEIL] clé autoincrémentée sous oracle .

Edit Maousse : lol mince, grillé par Shakes !

__________________
Time goes by

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageSSolacinGuruNiveau 11 · CinéphileRéférenceur Novice
Membre depuis
2003
Messages
8254
Plus
Membre n°
11117
Inscription
23 Mar 2003
Localisation
974
Âge
52 ans
Sujets lancés
28
Ancienneté
96 %
Participation
89 %
Ancien message 28-10-2003 10:29
@gisele :
Bon, voila une méthode qui te permettra de faire de l'autoincrémentation sous Oracle
c'est en anglais, mais c'est super simple à comprendre :

Citation

Suppose you have a database and you want each entry to be identified by a unique number. You can do this easily in mysql by specifying "auto_increment" for your number, but Oracle makes you work a little more to get it done. Here is one way to do it by creating two database objects, a sequence and a trigger. I find myself wanting to do this every now and then but not often enough that I remember the syntax from time to time, so I decided it was time to write myself up a little cheat sheet. This is an extremely basic outline, so please try it first on a test table if you don't know what you're doing.

1. Let's say we have a table called "test" with two columns, id and testdata. (This is just a dumb quick example, so I won't bother to specify any constraints on id.)


create table test (id number, testdata varchar2(255));

2. Next we'll create a sequence to use for the id numbers in our test table.


create sequence test_seq
start with 1
increment by 1
nomaxvalue;

You could change "start with 1" to any number you want to begin with (e.g. if you already have 213 entries in a table and you want to begin using this for your 214th entry, replace with "start with 214"). The "increment by 1" clause is the default, so you could omit it. You could also replace it with "increment by n" if you want it to skip n-1 numbers between id numbers. The "nomaxvalue" tells it to keep incrementing forever as opposed to resetting at some point. i (I'm sure Oracle has some limitation on how big it can get, but I don't know what that limit is).

3. Now we're ready to create the trigger that will automatically insert the next number from the sequence into the id column.


create trigger test_trigger
before insert on test
for each row
begin
select test_seq.nextval into :new.id from dual;
end;
/

Obviously you would replace "test_trigger" with something a little more meaningful for the database table you want to use it with, "test" would be your table name, and the "id" in :new.id would be replaced with the name of the column. Every time a new row is inserted into test, the trigger will get the next number in the sequence from test_seq and set the "id" column for that row to whatever the sequence number is. Note that sequences sometimes appear to skip numbers because Oracle caches them to be sure that they are always unique, so this may not be your ideal solution if it's really important that the id is exactly sequential and not just mostly sequential and always unique.



--------------------------------------------------------------------------------

Here are a couple of questions the above might raise. This is pretty intuitive stuff, but I'm aiming it at the Oracle newbie since no expert would be reading this page anyway.

How do you tell what sequences and triggers are already out there?


select sequence_name from user_sequences;
select trigger_name from user_triggers;

How do you get rid of a sequence or trigger you created?


drop sequence test_seq;
drop trigger test_trigger;

Again, replace test_seq and test_trigger with the specific names you used. You can also keep the trigger but disable it so it won't automatically populate the id column with every insert (and enable it again later if you want):


alter trigger test_trigger disable;
alter trigger test_trigger enable;

__________________

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageMMyrtulDébutantNiveau 4 · Fan de VHSRéférenceur Novice
Membre depuis
2002
Messages
235
Plus
Membre n°
4144
Inscription
02 Sep 2002
Localisation
pas loin...
Sujets lancés
15
Ancienneté
98 %
Participation
25 %
Ancien message 28-10-2003 11:11
Hop la, je me permet de ramener ma fraise etant dba oracle...
Le moyen de creer une clef autoincrementée sous oracle est sous la forme d'une sequence+ trigger .
(Une sequence est un objet qui s'auto incremente quand on y fait appel)

piti exemple, c'est toujours plus parlant.
je veux que la colonne Id de ma table test s'autoincremente dés que j'ajoute un enregistrement dans celle ci
#Creation de la table
create table test (id number , data varchar2(10));

#creation de la sequence
Create sequence my_seq start with 1 increment by 1 nocycle cache 5;

# Creation du trigger
create or replace trigger inc_test_id
before insert on test
for each row
declare
n number;
begin
if :old.id is null then
select my_seq.nextval into n from dual;
:new.id := n;
end if;
end;
/

Chaque appel a my_seq.nextval incrementera la clef. La valeur initiale etant definie a la creation
SQL>select my_seq.nextval from dual ;
NEXTVAL
----------
1

SQL> select my_seq.nextval from dual ;
NEXTVAL
----------
2

Si maintenant je fais des insertions dans la table test
SQL>insert into test (data) values ("Hello1");
SQL>insert into test (data) values ("Hello2");
SQL>insert into test (data) values ("Hello3");

On verifie que la sequence est bien incrementée.
SQL>select * from test;
ID DATA
---------- ----------
1 Hello1
2 Hello2
3 Hello3



ATTENTION: il peut y avoir des 'trous' dans la creation , la sequence ne garantie que l'unicité des id, c'est de toute facon inutile et illogique de vouloir absolument des chiffres qui se suivent (que se passe t il quand on supprime un enregistrement ?) .

__________________
Myrtul
:wq

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageMMyrtulDébutantNiveau 4 · Fan de VHSRéférenceur Novice
Membre depuis
2002
Messages
235
Plus
Membre n°
4144
Inscription
02 Sep 2002
Localisation
pas loin...
Sujets lancés
15
Ancienneté
98 %
Participation
25 %
Ancien message 28-10-2003 11:13
ah bein je me suis fais eu de vitesse

__________________
Myrtul
:wq

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageSshakes808080GuruNiveau 27 · FigurantRéférenceur Appliqué
Membre depuis
2002
Messages
8978
Plus
Membre n°
517
Inscription
08 Mar 2002
Sujets lancés
354
Ancienneté
100 %
Participation
91 %
Ancien message 28-10-2003 11:27
Message écrit par Myrtul, le 28-10-2003 à 11:13
ah bein je me suis fais eu de vitesse


oui,mais c'est en français

__________________
Racket logiciel

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageWwlad93ExpertNiveau 14 · Jury du publicRéférenceur Appliqué
Membre depuis
2002
Messages
2596
Plus
Membre n°
4328
Inscription
09 Sep 2002
Localisation
Utopia
Sujets lancés
163
Ancienneté
98 %
Participation
68 %
Ancien message 28-10-2003 11:31
Et c'est une rédaction originale, spéciale oxmo !

Bravo Myrtul !

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageSSolacinGuruNiveau 11 · CinéphileRéférenceur Novice
Membre depuis
2003
Messages
8254
Plus
Membre n°
11117
Inscription
23 Mar 2003
Localisation
974
Âge
52 ans
Sujets lancés
28
Ancienneté
96 %
Participation
89 %
Ancien message 28-10-2003 15:10
@Myrtul :
Merci pour la version française (moi, je ne suis pas DBA, donc j'ai mis ce que j'ai trouvé surtout )

__________________

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageGgiseleNewbieNiveau 2 · Spectateur
Membre depuis
2003
Messages
18
Plus
Membre n°
13084
Inscription
27 Jul 2003
Âge
54 ans
Sujets lancés
5
Ancienneté
95 %
Participation
6 %
Ancien message 29-10-2003 09:06
salut d'abord pardon pour mon indiscipline editoriale et merci d'abord corrigé mon titre de topic.
pis surtout merci pour les réponses la sequence c'est pilpoil la soluce et ça marche.
le trigger est il indispensable?
je crois qu'ensuite on peut également le gerer directement dans l'insert
avec
insert into ma_table (id,.....,.....) values(nom_de_la_sequence.nextval,......,.......)
quelqu'un peut confirmer?
a+ les gens

__________________

il n'y a pas de sotte existence

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageMMaousseGuruNiveau 25 · Chef opérateurRéférenceur Novice
Membre depuis
2002
Messages
15626
Plus
Membre n°
1121
Inscription
14 Apr 2002
Sujets lancés
211
Ancienneté
100 %
Participation
100 %
Ancien message 29-10-2003 10:26
Maousse en plein rangement...
Ce topic est du Soft, alors zouuuu en section Software

__________________
Time goes by

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageMMyrtulDébutantNiveau 4 · Fan de VHSRéférenceur Novice
Membre depuis
2002
Messages
235
Plus
Membre n°
4144
Inscription
02 Sep 2002
Localisation
pas loin...
Sujets lancés
15
Ancienneté
98 %
Participation
25 %
Ancien message 29-10-2003 21:04
Citation
le trigger est il indispensable?

si tu veux de l'auto increment oui (comme l'equivalent en mysql) , tu peux bien sur passer par l'appel a la sequence dans ton ordre sql . "

timtowtdi" comme dirait l'autre

__________________
Myrtul
:wq

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageGgiseleNewbieNiveau 2 · Spectateur
Membre depuis
2003
Messages
18
Plus
Membre n°
13084
Inscription
27 Jul 2003
Âge
54 ans
Sujets lancés
5
Ancienneté
95 %
Participation
6 %
Ancien message 05-12-2003 11:37
euh vi y a quand même une question qui m'interpelle dans la creation de la sequence qui sommes toute est tres simple sauf un truc:
pourquoi nocycle cache 5?

__________________

il n'y a pas de sotte existence

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageMMyrtulDébutantNiveau 4 · Fan de VHSRéférenceur Novice
Membre depuis
2002
Messages
235
Plus
Membre n°
4144
Inscription
02 Sep 2002
Localisation
pas loin...
Sujets lancés
15
Ancienneté
98 %
Participation
25 %
Ancien message 08-12-2003 16:35
nocycle indique que ta sequence ne boucle pas . Elle demarre a la valeur que tu lui donne (start with) et se termine par la valeur maximale (indiqué dans l'ordre de creation par maxvalue ou par default a 1.0E+27)

cache 5 te permet de mettre en memoire les 5 prochaines valeurs de ta sequence. Cela est un peu plus performant que de laisser oracle calculer la prochaine valeur mais le desavantage est qu'en cas de crash de ta base tu perds les valeurs en memoire (pas bien grave de toute facon mais il faut eviter d'en mettre trop en cache sinon ta numerotation risque d'avoir de gros trous si tu as des crashs frequents )


un gros doute m'envahit...tu as accés a la doc ?ca aide

__________________
Myrtul
:wq

Signaler ce message à un modérateur | IP: Logguée

Réduire ce messageSSolacinGuruNiveau 11 · CinéphileRéférenceur Novice
Membre depuis
2003
Messages
8254
Plus
Membre n°
11117
Inscription
23 Mar 2003
Localisation
974
Âge
52 ans
Sujets lancés
28
Ancienneté
96 %
Participation
89 %
Ancien message 09-12-2003 10:19
Bonne question Myrtul, parce que c'est vrai que sans la doc, c'est plutôt ardue Oracle (je corrige ......... avec la dos, c'est ardue aussi )

__________________

Signaler ce message à un modérateur | IP: Logguée

Il est actuellement 18:04 (GMT) NOUVEAU SUJET    RÉPONDRE   
  Sujet précédent   Sujet suivant
Link Station > Section Technique > Software > [CONSEIL] clé autoincrémentée sous oracle

Aller au Forum:
Notez ce sujet :


Réponse rapide
Afficher une version imprimable | Chercher dans ce sujet | Envoyer cette page par email | S'inscrire à ce sujet | Télécharger ce sujet
Règles du forum :
Créer de nouveaux sujets
Répondre aux messages
Attacher des fichiers
Editer vos messages
: not autorisé
: not autorisé
: not autorisé
: not autorisé
Le Code HTML est OFF
Le BBCode est ON
Les Smileys sont ONs
Le code [IMG] est ON
Page générée en 0.081746 secondes en exécutant 51 requêtes SQL.
Apache - Compression GZIP : Activée.