Gå til innhold

Slette data fra flere tabeller samtidig


Anbefalte innlegg

Videoannonse
Annonse
prøver å få slettet informasjon fra flere tabeller samtidig. Sletter fra en av tabellene med følgende kode:

 

DELETE * FROM brukere WHERE brukerid='AB';

 

Hvordan får jeg slettet informasjon fra flere tabeller samtidig?

7094830[/snapback]

Hvis du ønsker å slette f eks alle innleggene til denne brukeren så kan det være en idé å se på cascading (under foreign keys). Du vil da kunne kjøre en kommando for å slette en bruker, og samtlige innlegg som denne brukeren har laget. Men, dette bør gjøres med varsomhet og grundig testes, ellers kan du fort miste mye mer data enn du ønsker.

Lenke til kommentar
Gjest Slettet+142

DELETE * FROM brukere WHERE brukerid='AB' OR brukerid='CD';

 

er det ikke egentlig:

DELETE FROM brukere WHERE brukerid='AB' OR brukerid='CD';

?

sånn som dette du mener?

å kjøre en loop vil uansett være bedre ;)

Endret av Slettet+142
Lenke til kommentar
er det ikke egentlig:

DELETE FROM brukere WHERE brukerid='AB' OR brukerid='CD';

 

Du må jo velge hvilkene felter i tabellen som skal slettes... slik jeg ser det gjør ikke dette utsagnet, men godt mulig jeg tar feil her....

 

å kjøre en loop vil uansett være bedre ;)

7096401[/snapback]

 

Planen er at du skal kunne slette en bruker i en tabell - hvorfor da kjøre en loop når du kan gjøre dette ved hjelp av en SQL-settning?

Lenke til kommentar

Nei, du sletter ikke felter, du sletter poster, alle databasene jeg har vært borti gir en feilmelding om du sier delete * eller delete <feltliste>. Hva tror du skjer med de resterende feltene?

 

Hvis du ønsker å slette data fra flere tabeller i en sql, må du (igjen for de databasene jeg har brukt og std SQL) bruke cascading delete som nevnt over. ellers så må du kjøre en serie med spørringer:

 

DELETE from innlegg where brukerid = 'AB';
DELETE from ... where brukerid = 'AB';
DELETE from bruker where id = 'AB';

 

mange databaser tillater bruk av variabler i sql, slik at du kan sette en variabel først og så bruke den i deletene etterpå, men det er databasespesifikt. Noen kan kanskje hjelpe hvis du sier hvilken database du bruker.

 

Forresten, i stedet for OR, kan man ofte bruke in:

DELETE from brukere where brukerid in ('AB','CD');

 

uttrykket i in kan da også ofte være en subquery.

 

M.

Lenke til kommentar

La oss si at du har et par tabeller, order, event og contact og du disse er linket sammen, og du vil slette en bruker med tilhørende ordre og ordrenes events. Da kan du, hvis du har contactid skrive noe slikt som:

 

DELETE FROM event WHERE id_order IN (SELECT orderid FROM order WHERE id_contact = x);

DELETE FROM order WHERE id_contact = x;

DELETE FROM contact WHERE contactid = x;

 

Du kjører så det i en transaksjon slik at enten blir alle dataene slettet eller ingen hvis det er noe mer du har glemt å tenke på :)

 

Det er forresten veldig vanlig å ha primary keys som heltall som teller oppover fra og med 1 og ikke tekststrenger...

Lenke til kommentar

Vel Microsoft JET Database Engine benytter seg vel av syntaxen "DELETE * FROM ...". Så Access databaser har vel brukt denne syntaxen. Der kan man faktisk slette felter.

 

Men dóg litt offtopic, egentlig.

Endret av kakkle
Lenke til kommentar
Vel Microsoft JET Database Engine benytter seg vel av syntaxen "DELETE * FROM ...". Så Access databaser har vel brukt denne syntaxen. Der kan man faktisk slette felter.

 

Men dóg litt offtopic, egentlig.

7101239[/snapback]

 

Det vil vel da strengt tatt si at den nullstiller feltene, ikke at de slettes dersom man bruker noe annet en * etter delete?

 

M.

Lenke til kommentar
Nei, du sletter ikke felter, du sletter poster, alle databasene jeg har vært borti gir en feilmelding om du sier delete * eller delete <feltliste>. Hva tror du skjer med de resterende feltene?

 

 

trodde de ble værene igjen i databasen og tok opp plass siden det ikke ble markert at de skulle bli slettet...

Lenke til kommentar
Hva med å brukke triggere her da?

Jeg kan ikke noe særlig om trigger, men jeg synes det ser ut som en artig mulighet.

Tilogmed MySQL støtter triggere nå.

7105686[/snapback]

Det fineste ville vel vært å bruke en SP som sletter.

EXEC SlettBruker 'AC'

Jeg er alltid forsiktig med triggere. I alle fall i dette tilfellet hvor en SP forsåvidt er mer hensiktsmessig.

 

Erfaringsmessig ville jeg bare satt brukeren til active=0, deleted=1 eller noe slikt, som et eget felt i brukerdatabasen. Historikk er uvurdeelig :)

Endret av Manfred
Lenke til kommentar
Hva med å brukke triggere her da?

Jeg kan ikke noe særlig om trigger, men jeg synes det ser ut som en artig mulighet.

Tilogmed MySQL støtter triggere nå.

7105686[/snapback]

Det fineste ville vel vært å bruke en SP som sletter.

EXEC SlettBruker 'AC'

Jeg er alltid forsiktig med triggere. I alle fall i dette tilfellet hvor en SP forsåvidt er mer hensiktsmessig.

7110835[/snapback]

 

Hvis du bruker SP - må du ike da lage en Sp for hver bruker som skal slettes eller kan gjøre slik at en lager en SP og brukernavnet blir satt inn avhengig av hvem som skal slettes?

Lenke til kommentar
Hvis du bruker SP - må du ike da lage en Sp for hver bruker som skal slettes eller kan gjøre slik at en lager en SP og brukernavnet blir satt inn avhengig av hvem som skal slettes?

7110853[/snapback]

En stored procedure kan ha en elelr flere parametre, f eks brukernavn. Det er hele poenget med en stored procedure. En stored procedure uten parametre er så godt som verdiløs (med noen hederlige unntak).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...