13. marts 2001 - 09:07Der 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.
Udfordringerne hober sig op i fødevare- og drikkevareindustrien og gør den til en af de mest sårbare.
24. oktober 2024
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;
Synes godt om
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.
Synes godt om
Slettet bruger
13. marts 2001 - 09:37#3
En anden måde, hvis du har kontrollen fra din applikation, kunne du sige
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?
Synes godt om
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...
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\');
Synes godt om
Ny brugerNybegynder
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.