Avatar billede suix Nybegynder
04. oktober 2007 - 10:45 Der er 4 kommentarer og
1 løsning

Omdøb/sletning af data

Hej,
Jeg har lavet et system, hvor brugere registrerer ydelser i en database på baggrund af ydelses_id i én tabel, og selve registreringen i en anden tabel.
Mit problem er så, når man skal slette en ydelse, der allerede er registreret, så får man naturligvis en constraint-fejl. Men hvordan strukturerer man en database således, at når man f.eks. sletter /omdøber en "ydelse", så beholder allerede eksisterende registreringer de værdier de oprindelig blev registreret med? Er den eneste måde at registrere selve ydelses-navnet på registreringen i stedet for kun ID'et fra ydelses_tabellen.
Håber I forstår?
Avatar billede ffsoft Praktikant
04. oktober 2007 - 12:17 #1
Du må ikke slette en primærnøgle, hvis der er en fremmed nøgle der peger på den.
Du kan istedet gøre posten usynlig for brugeren ved at have et ja/nej felt i tabellen der hedder "Synlig"

tblYdelseType
  YdelseID
  YdelseNavn
  Synlig

Når du så skal give brugeren noget at vælge imellem kan du skrive:

Select * From tblYdelseType Where Synlig ='Ja';
Avatar billede chrisp Nybegynder
04. oktober 2007 - 23:33 #2
Du kan eventuelt kigge på cascade update og cascade delete.

så vidt jeg kan forstå er det primært et problem når man skal slette..

når man "opdater" en ydelse sker der vel ikke noget med dens id vel ?
Avatar billede suix Nybegynder
13. oktober 2007 - 19:50 #3
ffsoft->Jeg ved godt man ikke kan slette en primærnøgle, hvis den refererer til en anden tabel. Det som jeg prøver at opnå er, at selvom en ydelse bliver slettet, så er de værdier der er registrerede stadigvæk bevarede i en anden tabel. Hvis man skal opnå det, bliver man vel nødt til at gemme beskrivelsen på ydelsen, istedet for Id'et.
chrisp->Når man bruger cascade, så bliver alle relaterede poster vel også slettet i andre tabeller?

Det som jeg egentligt gerne vil undgå, er at omstrukturere databasen. Pt. så gemmes ydelsesID'et i en tabel der hedder registrering, hvor ydelsesID refererer til tabellen ydelse.
Når der så bliver registreret en ydelse i tabellen registrering, og de så senere sletter ydelsen og ydelsesID'et, så bliver dataene i registrerings-tabellen ugyldige. Men den eneste måde at omgå dette er vel at registrere selve navnet på ydelsen i tabellen registrering, og droppe tabllen ydelser. Eller evt. at catche en exception i java, og fortælle brugeren at den ikke kan slettes pga. allerede eksisterende registreringer. Hvis der er nogen der har en bedre løsning på problemet... vil det være super.
Avatar billede ffsoft Praktikant
14. oktober 2007 - 17:50 #4
Hvis du bruger cascading delete sletter du ALT fra databasen, med det aktuelle ID. Når du ønsker både at slette og bevare, kan jeg ikke se andet end den løsning med at skjule, som jeg foreslår.
Avatar billede chrisp Nybegynder
14. oktober 2007 - 18:14 #5
Hmm hvis du ikke vil ændre på db designet er der ikke meget du kan gøre..
det nemmeste "fix" vil være at droppe din fremmednøgle kobling, da den jo ikke "passer" mere.

hvis du skal have mere kvalificeret råd, vil jeg forslå at du beskriver hvordan dine tabeller ser ud..
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