21. maj 2003 - 19:11Der er
28 kommentarer og 1 løsning
oprettelse af primer nøgle fra java
hejsa lige et eks. to felter i oracle nr og navn, nr er nøgle felt hvis jeg opretter direkte i oracle vil jeg se nå næste felt er ... nr5 så siger jeg bare insert into table values(5, 'hans'); hvis jeg nu gør det fra java så ved jeg jo ikke hvad næste ledige felt er i nr det bliver jo noget med: String sql = "INSERT INTO table VALUES("; sql += nr + ", "; sql += "'" + navn + "');"; men men den skal vel bruge en next eller sådan noget for at sætte ind på næste ledige post nogen forslag ????
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
1) Du fortæller databasen at det første felt er et autoincrement felt og så indsætter du kun de øvrige værdier: INSERT INTO tabelnavn (felt2navn) VALUES('xxxxxx') hvorefter databsen selv putter en værdi i det første felt.
Der er så forskellige mådet at få fat den genererede værdi på.
2) Du vælger at numrene ikke behøver at være i rækkefølge men kun at de skal være unikke. Og så genererer du nogle unikke værdier f.eks. med Scott Amblers High Low Approach og indsætter det.
fatter minus af det du kommer med og kan heller ikke finde noget af det i nogen bøger hmmm men nr 1 lyder rimelig men hvad hedder oprettelsen så i sql create table test(nr int, navn char)primary key (nr); autoincrement hvor kommer det ind?
Hvis du opretter en sequence i basen kan du blot skrive [sequence_navn].nextval ud for vædien af nr altså: sql = "INSERT INTO table VALUES(seq1.nextval, " + ... Men du skal være opmærksom på at denne aldrig vil give samme nummer to gange, MEN at der kan opstå huller. Med "aldrig" gælder selvfølgelig at du opretter sequencen således.
sequence kan jeg nu heller ikke finde noget om i fundamentals of database systems bogen hi men jeg har i oracle kun skrivet nr int som primær nøgle og ved ikke om java forstår sql = "INSERT INTO table VALUES(seq1.nextval, " + 'navn');
ok prøver lige i morgen når jeg kommer ind på edb skolen men pis jeg er i tidsnød :(((())) har til den 28 deadline og jeg er bare bagefter surt show INTO table VALUES(seq1.nextval, " + 'navn'); kun et eks men er det rigtigt forstået
Jep, men husk at oprette sequencen, se evt. CREATE SEQUENCE i online manualerne Og hvis du ikke laver aliases så læg sequencen i samme schema som din table
hmm mener du javadoc for i java bogen står der ski heller ikke en disse om CREATE SEQUENCE . jeg har nogle db klasser med metoder hvor jeg opretter insert i ?????? skal have det let letter at gå til ind som så :)
hov jeg har forbindelse til databasen da jeg henter oplysninger fra den NU skal bare et skridt vidre ned at indsætte oplysninger i tabellerne og der kom jeg i tvivl om det med nøgleværdier da de skal ikke sættes ind manuelt men i det jeg sige insert skal den "bare" :) sætte data ind på næste tomme felt med tilhørende tubler
Med mindre der gør sig specielle forhold gældende for Oracle, så er det heller ikke sikkert at lave en SELECT MAX + 1 og INSERT, hvis der kan være mere end en samtidig bruger.
alså jeg er tilbage ved start create table value( nr "et eller andet" int, 'navn' char)primary key (nr) ; skær det ud i pap!!!!!! og arne jeg har ingen oracle bog derfor spørger jeg her mente der var en der kunne finde sætningen jeg skal bruge :)
create table testtabel ( nummer number(9999), navn varchar2(50)); create unique index testtabel_pk on testtabel (nummer); create sequence testtabel_pk_seq nocache; insert into testtabel values(testtabel_pk_seq.nextval,'Hans');
alt er ud fra hukommelse, så der er plads til forbedringer.
vil det sige hee den tabel jeg har i forvejen inde i oracle kan jeg bare fyre den kommando af: create unique index min_tabel_pk on min_tabel(nr); og fra java: insert into min_tabel values(min_tabel_pk_seq.nextval,'Hans'); ved så ikke pk er det bare noget du har fundet på eller er det et most?
CREATE TABLE test (id number(10) PRIMARY KEY, navn varchar2(10)); CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1;
create or replace trigger test_trig before insert on test for each row when (new.id is null) begin select test_seq.nextval into :new.id from dual; end; /
så er det bare at indsætte, den laver selv et nyt id hver gang insert into test (navn) values('Jonas');
roo104 kan jeg ligge det på en eksisterende tabel: CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1;? det næste fatter jeg ikke helt: create or replace trigger test_trig before insert on test for each row when (new.id is null) begin select test_seq.nextval into :new.id from dual; end; / læser det lidt som om jeg først skal lave en select test_seq.nextval into ....osv for jeg laver en insert into test....osv men undlade at indsætte nøglen
Du kan godt lave det på en eksisterende tabel bare sæt sequencen til at starte med det id du er nået til. Når du har oprettet sequence opretter du triggeren, som sættet id ind på id's plads sammen med resten af det data du skal indsætte, derved opnår har du autoid som i access, mysql etc.
hejsa roo104 jeg har prøvet det i skolen her til dag men ok CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1;? som her det godtog den fint nok på eksisterende tabel men så kom problemet da jeg ville fyre trikker af when (new.id is null) begin select test_seq.nextval into :new.id from dual; end; / prøvede sådan og så uden (new.id is null) men uanset så ville den ikke godtage new og så opgav jeg kunne desvære ikke lokke på experten fra edb skolen for ellers havde jeg svaret før men er lige kommet ind af døren :(
hejsa roo104 pt kommet hjem fra skolen kunne godt se dit indlæg men æv kunne stadig ikke sende men nu har jeg taget det med : create table Ordre ( ordreNr INT, afg_locationNr INT, acc_locationNr INT, vareNr INT, modDato DATE, afgDato DATE, accDato DATE, PRIMARY KEY (ordreNr), FOREIGN KEY (afg_locationNr) REFERENCES location(locationNr), FOREIGN KEY (acc_locationNr) REFERENCES location(locationNr), FOREIGN KEY (vareNr) REFERENCES vare(vareNr) ); CREATE SEQUENCE Ordre_seq START WITH 1 INCREMENT BY 1;
ok men hvis du vil udnyttes lidt mere :) første linie er som det skal og kan oprettes i oracle : // insert into ordre values (1,101001,NULL,2,NULL,to_date('2003-01-05:0900','yyyy-mm-dd:hh24:mi'),NULL)); dette er så fra java hvor jeg skal have de default ind NULL og sysdate:
public void opretOrdre(int ordreNr, int afg_locationNr, int vareNr, ) { String sql = "INSERT INTO Ordre VALUES("; sql += ordreNr + ", "; sql += afg_locationNr + ", "; sql += acc_locationNr + ", ", "; // NULL sql += vareNr + ", "; sql += modDato + ", "; // NULL sql += afgDato + ", "; // sysdate sql += accDato + ", "; // NULL men op jeg kan få den til det neeej den skal øffe jeg har lavet det med andre sætninger til oracle/jave bare ikke med NULL værdier men med sysdate og det virker fint måske kan du se hvad der går galdt ?
du skal vel heller ikke have komma efter accDato, det skal være en )
Men hvis du laver en trigger er det: create or replace trigger ordre_trig before insert on ordre for each row when (new.ordreNr is null) begin select ordre_seq.nextval into :new.ordreNr from dual; end; /
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.