Avatar billede dannv Nybegynder
06. august 2003 - 21:24 Der er 10 kommentarer og
1 løsning

Indsætte data i binært træ

Jeg har et problem når jeg registrere værdier i min MySQL database. Jeg har nogle brugere som via en webside (jsp og java bønner) skal indtaste nogle data, som så skal lagres i min db. Efterfølgende skal denne bruger have vist en kvittering for hvad det var han registrerede i db’en.

Min table består af følgende kolloner:

ID (Primary Key, auto-increment)
location_name
location_id
level

Her er det meningen at der skal registreres svarende til et binært træ. Altså på level 1 skal der registreres et rum/lokale. På level 2 skal der registreres en skab eller lignende i rummet fra level 1 (location_id sættes her til id for rummet fra level 1). på level 3 registreres en hylde i skabet fra level 2 (Her sættes location id til id fra skabet på level 2)…..

Det jeg så vil kunne det er når, jeg står med 3 værdier for 3 levels, så vil jeg kunne gemme dem i db korrekt så jeg får noget der ligner dette:

id | location_name | location_id | level
1  | Kælder        | null        | 0
2  | Skab          | 1          | 1
3  | Hylde        | 2          | 2

Her kunne der jo godt være flere rum med samme navn. Hvordan kan jeg så være sikker på at jeg får den korrekte id sat ind som location id for level 1... og den korrekte id som location id for level 2????

Min id kolonner er min pk og er et auto increment felt, og denne kan så vel ikke medtages i en insert statement…

Selve registreringen og den efterfølgende hentning af data foregår fra en java bønne. Der skal så først registreres, og lige derefter skal der laves en søgning på de samme data for at udskrive en kvittering. Men da min eneste unikke kolonne ikke styres af mig men af MySQL, hvordan kan jeg så være sikker på at jeg henter de data jeg lige har lagret....?????

Kort: hvordan lagre man i et binært træ og henter data igen og sikre sig at det er de værdier man lige har lagret man finder igen??
Avatar billede arne_v Ekspert
06. august 2003 - 21:33 #1
MySQL har en LAST_INSERT_ID funktion som finder den sidste auto increment
værdi for denne connection.
Avatar billede arne_v Ekspert
06. august 2003 - 21:36 #2
Hvis din JDBC driver er JDBC 3.0 compliant så kan du iøvrigt bruge:

stmt.getGeneratedKeys()

i Java.
Avatar billede arne_v Ekspert
06. august 2003 - 21:58 #3
Du mener sikkert bare træ og ikke binært træ. Der kan jo være flere
end to grene.

Hvis der kan være et variabel antal niveauer er det måde at gøre dte på.

Hvis der er et fast natal nivaier ville jeg lave en tabel per
niveau.

Fordi det er nemmere i queries.

Nu går det nok fordi du kan ligge en del logik i din Java bønne.
Avatar billede arne_v Ekspert
06. august 2003 - 21:59 #4
natal nivaier = antal niveauer

(med for mange tommelfingre på tastaturet)
Avatar billede dannv Nybegynder
07. august 2003 - 09:20 #5
Hej igen arne

Jeg tror det jeg er ude efter er det du beskriver som stmt.getGeneratedKeys(). Jeg tror ikke det i denne sammenhæng ville være smart at bruge LAST_INSERT_ID, der kunne jo have været en anden bruger der har registreret noget i den tid der går mellem registrering og hentning af data. Mht. antallet af niveauer er de tre her nævnt kun et udgangspunkt. Det kan senere blive ændret.

Et lille tillæg: Jeg har jo tre værdier som skal sættes ind. Jeg havde forestillet mig noget lignende:

INSERT INTO location (location_name, level)
VALUES ("Kælder", 0);

Derefter stmt.getGeneratedKeys() og så gøre det samme for næste niveau.

INSERT INTO location (location_name, location_id, level)
VALUES ("Skab", "stmt.getGeneratedKeys()", 1);

Og så det samme for næste level.

Hvis jeg sætter autoCommit = false, vil jeg så stadig få genereret en værdi for det felt som er auto increment, eller vil det først ske når man siger commit??
Avatar billede arne_v Ekspert
07. august 2003 - 09:23 #6
LAST_INSERT_ID er også connection specifik, så det burde også virke.
Avatar billede arne_v Ekspert
07. august 2003 - 09:24 #7
stmt.getGeneratedKeys() returnerer et ResultSet som du skal hente
værdier ud af.
Avatar billede arne_v Ekspert
07. august 2003 - 09:27 #8
Jeg prøver lige at undersøge det med commit.

Her er et godt link til de her ting:
  http://www.mysql.com/articles/autoincrement-with-connectorj.html
Avatar billede arne_v Ekspert
07. august 2003 - 09:34 #9
Jeg er 99.999% sikker på at det også virker med autocommit off.

Men jeg kan ikke finde en referance.
Avatar billede arne_v Ekspert
07. august 2003 - 09:35 #10
Men prøv !
Avatar billede dannv Nybegynder
07. august 2003 - 12:43 #11
Ok tak for indsatsen
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