Avatar billede df9904 Nybegynder
13. marts 2001 - 09:07 Der er 5 kommentarer og
1 løsning

Autonummer.

Jeg vil gerne vide om man i oracle kan have en attribut som automatisk får et nummer når en ny forekomst oprettes i tabellen. Attributten skal bruges som nøgle for tabellen.
Avatar billede Slettet bruger
13. marts 2001 - 09:23 #1
Man kan lave en trigger, der sætter en værdi ind.

Hvis du har en tabel T:

CREATE TABLE T (
ID NUMBER PRIMARY KEY,
FIELD VARCHAR2(255)
);

Vil du kunne lave en SEQUENCE:

CREATE SEQUENCE S;

Og derpå en trigger på tabellen:

CREATE OR REPLACE TRIGGER bi_t
BEFORE INSERT
ON t
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
    CURSOR C IS
    SELECT S.NEXTVAL
    FROM DUAL;
BEGIN
    OPEN C;
    FETCH C INTO :NEW.ID;
    CLOSE C;
END;




Avatar billede Slettet bruger
13. marts 2001 - 09:26 #2
Et problem med denne \'approach\' er:

Der er ingen garanti for at du ikke vil have \'huller\' i de genererede ID\'s:
- Man kan forestille sig at nogen indsætter en post og derpå laver rollback.
- Hver ny session for tildelt \'bidder\' af sekvensen, det er ikke sikkert, de bliver brugt, inden sessionen afsluttes.

Når du har indsat en post, skal du til at søge i tabellen, for at finde den genererede værdi. Dette kan dog undgås, hvis du i samme session spørger efter S.CURRVAL.
Avatar billede Slettet bruger
13. marts 2001 - 09:37 #3
En anden måde, hvis du har kontrollen fra din applikation, kunne du sige

INSERT INTO T VALUES (S.NEXTVAL, \'En tekst\');

Og derved undgå at bruge en trigger.
Avatar billede luttichau Nybegynder
14. marts 2001 - 10:46 #4
Jeg er lidt grøn til oracle og den her slags sql men kunne man ikke lave den trigger sammen med et domain så man f.eks. kunne sætte den som en datatype, så ville man slippe for at skulle lave en trigger for hver tabel.
Jeg har ingen ide om hvordan man gør, men jeg tænkte at det sikkert kunne lade sig gøre?
Avatar billede Slettet bruger
14. marts 2001 - 11:03 #5
luttichau--> Jeg tror ikke, det vil blive nemmere. Så skal du til at bruge OO-udtryk i dine statements, kalde den implicitte konstruktor på datatypen osv...
Avatar billede madder Nybegynder
14. maj 2001 - 23:30 #6
Man behover ikke at lave dette med trigger...
man skal bare:

create sequence foo start with 1000;

og sa nar du vil insert into table:

insert into tablefoo(auto_increment_field,val1,val2)
values(foo.nextval,\'val1\',\'val2\');

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester