Avatar billede googolplex Novice
28. august 2003 - 23:38 Der er 9 kommentarer og
1 løsning

Automatisk sletning af gamle SQL-rækker

Er det muligt at sætte en maximal størrelse på en MySQL tabel (eksempelvis 10000), således at de ældste rækker konstant slettes (evt. i bidder af 1000) hvis der er for mange ?
Avatar billede ztyxx Nybegynder
28. august 2003 - 23:41 #1
hvis du logger tid, kan du slette dem der er over en hvis "alder"
Avatar billede googolplex Novice
28. august 2003 - 23:43 #2
Ja, det ved jeg, men jeg ville gerne om man kunne gøre det automatisk. Det er til min log, således at størrelsen på databasen ikke løber løbsk :)
Avatar billede jakobandersen Nybegynder
28. august 2003 - 23:48 #3
Kør et cronjob der sletter ældre indlægene enten udfra tidstempel eller fortløbende ID.
Avatar billede googolplex Novice
28. august 2003 - 23:54 #4
Cronjob er desværre udelukket, kan det gøres på andre måder ?
Avatar billede jakobandersen Nybegynder
29. august 2003 - 00:00 #5
Så vidt jeg ved har mySQL ikke noget scheduling indbygget, og Triggers kommer først i næste version så jeg tror ikke der er så mange andre muligheder tilbage andet end at udføre din "rækkereducering" fra applikationslaget.
Avatar billede googolplex Novice
29. august 2003 - 00:03 #6
Triggers, er det med i 4.0 ? Kan de løse det ?

'jeg tror ikke der er så mange andre muligheder tilbage andet end at udføre din "rækkereducering" fra applikationslaget.' - Hvad betyder det på dansk :)
Avatar billede jakobandersen Nybegynder
29. august 2003 - 00:13 #7
Triggers skulle være med i 5.0 som pt. ligger i deres udviklingstræ. se evt.:
http://www.mysql.com/documentation/mysql/bychapter/manual_Introduction.html#ANSI_diff_Triggers

I PostgreSQL kunne man f.eks. gøre sådan her med triggers for at klare dit problem:

CREATE TRIGGER maxentries_logtable
    BEFORE INSERT ON logtable FOR EACH STATEMENT
    EXECUTE PROCEDURE makespace_logtable;

Hvor makespace_logtable er en stored procedure der sørger for at slette den ældste post jvf. ID'et hvis der er over x antal poster i tabellen.

"rækkereducering" fra applikationslaget er at du manuelt udfører triggeren f.eks.

OpenDatabase();
// Åbn databaseforbindelse
InsertLogEntry();
// Indsæt din logentry
CleanUpLog();
//Slet de ældste rækker således at der er (x - 1) rækker i tabellen igen
CloseDatabase()
//Luk igen

Og x er selvfølgelig det maksimale antal rækker.
Avatar billede googolplex Novice
29. august 2003 - 00:20 #8
Ok, så kan jeg bare lave det sådan, at hvis der er mere end 11000 rækker, så sletter den de sidste 1000 :) Det kræver vel bare 3 SQL-forespørgelser
(en til at indsætte, en til at tjekke hvor mange poster der er og en til at slette :()

Men det med triggers lyer smart og er vel også meget hurtigere!!

Dump et svar!
Avatar billede googolplex Novice
29. august 2003 - 00:23 #9
Nåja, det havde du allerede gjort :P
Avatar billede jakobandersen Nybegynder
29. august 2003 - 00:27 #10
Du kan jo bare skifte til PostgreSQL, den har triggers :-)
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