Avatar billede nbj1 Praktikant
21. maj 2003 - 19:11 Der 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 ????
Avatar billede arne_v Ekspert
21. maj 2003 - 19:22 #1
Der er flere mulige løsninger på det problem.

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.
Avatar billede nbj1 Praktikant
21. maj 2003 - 19:47 #2
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?
Avatar billede teepee Nybegynder
21. maj 2003 - 19:51 #3
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.
Avatar billede teepee Nybegynder
21. maj 2003 - 19:52 #4
Autoincrement kan du vist sætte på i Designer, men den opretter bare en trigger (et mini-table-api) og trækker fra en sequence hvis jeg husker rigtigt
Avatar billede nbj1 Praktikant
21. maj 2003 - 19:58 #5
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');
Avatar billede teepee Nybegynder
21. maj 2003 - 20:00 #6
Det bliver først tolket når du parser det til din oracle database
Avatar billede nbj1 Praktikant
21. maj 2003 - 20:07 #7
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
Avatar billede teepee Nybegynder
21. maj 2003 - 20:15 #8
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
Avatar billede nbj1 Praktikant
21. maj 2003 - 20:29 #9
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å :)
Avatar billede teepee Nybegynder
21. maj 2003 - 20:33 #10
I din oracle database skal du connecte til og oprette en sequence under samme skema som tabellen ligger
Avatar billede arne_v Ekspert
21. maj 2003 - 20:33 #11
Nej det er en Oracle ting som du skal slå op i Oracle manualen og ikke
i Java manualen.
Avatar billede nbj1 Praktikant
21. maj 2003 - 20:38 #12
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
Avatar billede teepee Nybegynder
21. maj 2003 - 20:40 #13
Nej men du kan ikke bruge sequence.nextval FØR denne sequence findes. Den skal oprettes ganske som tabellen er blevet det i sin tid.
Avatar billede teepee Nybegynder
21. maj 2003 - 20:43 #14
Ellers må du snyde lidt, ved kun at bruge sql:

"insert into table values ((Select max(nr)+1 from table), " + navn...

eller noget i den stil, men det er en lidt kikset løsning synes jeg
Avatar billede arne_v Ekspert
21. maj 2003 - 20:46 #15
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.
Avatar billede nbj1 Praktikant
21. maj 2003 - 20:47 #16
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 :)
Avatar billede nbj1 Praktikant
21. maj 2003 - 20:48 #17
ja det er jo lige det arne da det jeg laver "prøver på " er et flere bruger system hvor rækken er låst og først bliver låst op igen med commit
Avatar billede lap Nybegynder
21. maj 2003 - 21:07 #18
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.
Avatar billede nbj1 Praktikant
21. maj 2003 - 21:23 #19
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?
Avatar billede lap Nybegynder
21. maj 2003 - 21:29 #20
Læs hvad jeg har skrevet!!!

create unique index testtabel_pk on testtabel (nummer);
create sequence testtabel_pk_seq nocache;

og derefter fra java:
insert into testtabel values(testtabel_pk_seq.nextval,'Hans');

og da du ikke har skrevet tabelnavne og kolonnenavne, så må du selv improvisere over navnene.
Avatar billede lap Nybegynder
21. maj 2003 - 21:36 #21
forresten er "pk" en officiel forkortelse for en primary key
Avatar billede roo104 Nybegynder
22. maj 2003 - 23:06 #22
Lav en sequence og en trigger

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');
Avatar billede nbj1 Praktikant
23. maj 2003 - 07:21 #23
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
Avatar billede roo104 Nybegynder
23. maj 2003 - 12:59 #24
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.
Avatar billede nbj1 Praktikant
23. maj 2003 - 21:31 #25
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 :(
Avatar billede roo104 Nybegynder
24. maj 2003 - 14:06 #26
Du skal lige rette dem til så de passer til din tabel id er kolonne med primærnøgle

test_seq.nextval er sequencenavn.nextval.

hvis du poster koden til oprettelse af tabel skal jeg strikke en sequence og trigger sammen som burde virker.
Avatar billede nbj1 Praktikant
24. maj 2003 - 20:54 #27
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 ?
Avatar billede roo104 Nybegynder
25. maj 2003 - 17:39 #28
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;
/

og indsær er så

String sql = "INSERT INTO Ordre (ordreNr,afg_locationNr,acc_locationNr,vareNr,modDato,modDato,accDato,) VALUES(";
  sql += afg_locationNr + ",";
  sql += acc_locationNr + ",";
  sql += vareNr + ",";
  sql += modDato + ",";
  sql += afgDato + ",";
  sql += accDato + ")";

Det ville jeg mene virker, du kan nok hakke den lidt pænere ud
Avatar billede nbj1 Praktikant
25. maj 2003 - 19:01 #29
ok jeg har fået det til at funke nok takker
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