[MySQL] Max 25 rows in DB

Pagina: 1
Acties:

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 27-07 16:57
Ik heb een database en ik wil dat er maximaal 25 rows in de tabel blijven staan. Maar met welke query kan ik dat simpel doen? Ik had al gedaan:
DELETE FROM tabel LIMIT 25 maar dan haalt ie er gewoon 25 weg..

Iemand anders die een query weet?

Verwijderd

DELETE FROM tabel WHERE id>25
in dit geval hebben dus alle rijen en id-nummer

Ik weet niet hoe dit in jouw specifieke geval zit, maar iets vergelijkbaars moet toch altijd wel mogelijk zijn

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Als je autoincrement gebruik zal dit nooit werken want je krijgt dan een steeds hogere id. Je moet bij het invoegen een veld invullen met NOW(), dan kun je daarop sorteren. Er is een techniekje waarbij je dan alle andere rijen kunt verwijderen maar dat moet ik je helaas schuldig blijven.

Verwijderd

Ik weet niet of MySQL triggers ondersteunt, anders moet je daar zeker eens naar kijken, wil je zeker zijn dat je 'nooit' meer dan 25 rows hebt, en jij dus niet elke keer zelf moet checken of dat het geval is.

Verwijderd

Ik denk dat je die gegevens gewoon rechtstreeks vanuit de database wil verwijderen (met bijv mysqladmin). Zoniet en mocht je nu een id-nummer hebben dat auto-increment is, dan kun je het volgende doen:

Als je nou bijvoorbeeld php gebruikt, kun je de database uitlezen en vervolgens de resultaten afdrukken met een while-loopje en een teller die meeloopt. Op het moment dat die teller op 25 staat, kijk je welke row-id daarbij hoort en vervolgens kun je wel doen wat ik in een eerdere post zei:
DELETE FROM tabel WHERE id>(de id die hoort bij de 25e rij)

[ Voor 6% gewijzigd door Verwijderd op 22-08-2003 21:43 ]


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 27-07 16:57
Hmm ik heb idd nu een goed id :) Je hebt namelijk mysql_insert_id() en daarmee kan je dus geowon de rows die ervoor zitten verwijderen :) thanks

Verwijderd

vertrouw nooit op autoincrement fields!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 27-07 16:57
hoezo niet?

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

omdat je nooit zeker weet of alle keys (ooit) bestaan hebben.
stel ik heb een tabel met autoincrement, die doet het dus gewoon.
stel dan dat ik (per ongeluk) een row insert zodra de id op 10 staat, waarbij ik bijvoorbeeld de id wel opgeef, dus zeg 100. Nu zal die autoincrement vanaf 100 verder tellen. en weet je dus niet of id's 11 t/m 99 bestaan, en zal jouw delete query ook niet het gewenste resultaat hebben.

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Er kan wel eens een gaatje vallen :)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 27-07 16:57
Ja dat weet ik, maar het is een geautomatiseerd script dat elke keer 1 row toevoegd, en dan moet ie gewoon de laatste weer verwijderen eigenlijk :)

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 13-08 14:09
misschien kun je iets doen met de count() functie?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Aangezien mysql geen subselects verstaat kan je dit, denk ik, het best oplossen door twee queries te gebruiken.
Een eerste select query om te achterhalen wat je allemaal weg wilt hebben, bijvoorbeeld alle items NA het 25e item (offset gebruiken bij je select) en die waarden dan in een IN-rijtje passen en via DELETE verwijderen, bijv:

SELECT id FROM tabel OFFSET 25
id's in een array stoppen, genaamd $ids ofzo
DELETE FROM tabel WHERE id IN ( . implode(', ', $ids) . )

oid in semi-php.
Een andere oplossing is die eis van 25 laten vallen, want die slaat eigenlijk ook nergens op. Als je max 25 items uit je db wilt halen kan je daar gewoon een select met een limit voor gebruiken. En weer een andere oplossing is om niet een "aantal" te specificeren maar bijvoorbeeld een datumveld of een id opzoeken die nog moet achterblijven en alles met een lager id dat moet verdwijnen.

etc etc etc

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 27-07 16:57
Hmm das wel een beter idee met 2 query's denk ik, hij select trouwens wel gewoon 25 records maar hij blijft maar toevoegen terwijl de rest gewoon echt nutteloos is, en ik wil het zoveelmogelijk automatiseren :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
djluc schreef op 22 August 2003 @ 21:22:
Als je autoincrement gebruik zal dit nooit werken want je krijgt dan een steeds hogere id.
Uhm...Waarom? Wat dacht je hier van?

code:
1
Delete From myTable Where ID<=(Select Max(ID)-25 From MyTabel)


Misschien niet helemaal SQL-correct, maar iets in deze trend zou moeten werken...

Dan ga er er trouwens wel van uit....
FvKnijff schreef op 22 August 2003 @ 22:24:
[...]
Er kan wel eens een gaatje vallen :)
...dat je niet "zelf" in je ID's gaat liggen klooien en tussenliggende nummertjes gaat zitten verwijderen.

...oh, en ik ken mySQL niet, dus ik weet niet of een subselect op deze manier ondersteund wordt (en lees zojuist hierboven dat dat niet kan, maar in dat geval is mySQL imho dus écht waardeloos)

[ Voor 48% gewijzigd door RobIII op 23-08-2003 00:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 27-07 16:57
Hmm sorry RobIII je query werkt niet helemaal (mysql_error()) en mijn mysql kennis is te klein om deze te debuggen :/ Maar ik heb het nou zo opgelost en het werkt best goed :)
code:
1
2
  $last=mysql_insert_id();
  mysql_query("DELETE FROM tabel WHERE id<$last-25");

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 21-08 17:05
Megamind schreef op 23 August 2003 @ 07:31:
Hmm sorry RobIII je query werkt niet helemaal (mysql_error()) en mijn mysql kennis is te klein om deze te debuggen :/ Maar ik heb het nou zo opgelost en het werkt best goed :)
code:
1
2
  $last=mysql_insert_id();
  mysql_query("DELETE FROM tabel WHERE id<$last-25");
[flauwe modus]
Op deze manier hou je steeds 26 rows in je table >:)
[/flauwe modus]

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Megamind schreef op 23 August 2003 @ 07:31:
Hmm sorry RobIII je query werkt niet helemaal (mysql_error()) en mijn mysql kennis is te klein om deze te debuggen :/ Maar ik heb het nou zo opgelost en het werkt best goed :)
code:
1
2
  $last=mysql_insert_id();
  mysql_query("DELETE FROM tabel WHERE id<$last-25");
Ook dat biedt geen garantie.
Wat als je last inserted id 100 is, en er zitten slechts 4 rijen in je tabel?

Als je een insert doet, en die insert mislukt, dan ben je het id van die row ook kwijt denk ik. Dan zit je dus al met een gap.

https://fgheysels.github.io/


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
RobIII schreef op 22 August 2003 @ 23:56:
[...]
Uhm...Waarom? Wat dacht je hier van?
code:
1
2
Delete From myTable Where ID<=
(Select Max(ID)-25 From MyTabel)

(en lees zojuist hierboven dat dat niet kan, maar in dat geval is mySQL imho dus écht waardeloos)
Zoals je nu weet kun je daar natuurlijk nooit van uit gaan, omdat er gaten in je index kunnen zitten.

Ik heb nu geen zin om een discussie te gaan voeren over de waarde(loosheid) van MySQL, dat draagt niets bij aan dit topic.

Ik heb trouwens wel een oplossing gevonden:
Je locked eerst heel de table
update SET del=0 ORDER BY id DESC LIMIT 25
DELETE WHERE del=1
UPDATE SET DEL=1
Tabel vrijgeven.

[ Voor 3% gewijzigd door djluc op 23-08-2003 11:10 ]


  • Ritch
  • Registratie: December 1999
  • Laatst online: 21-08 14:45
djluc schreef op 23 August 2003 @ 11:10:
[...]

Zoals je nu weet kun je daar natuurlijk nooit van uit gaan, omdat er gaten in je index kunnen zitten.

Ik heb nu geen zin om een discussie te gaan voeren over de waarde(loosheid) van MySQL, dat draagt niets bij aan dit topic.

Ik heb trouwens wel een oplossing gevonden:
Je locked eerst heel de table
update SET del=0 ORDER BY id DESC LIMIT 25
DELETE WHERE del=1
UPDATE SET DEL=1
Tabel vrijgeven.
3 queries is wel beetje veel hiervoor.
de vraag is meer waarom er maar 25 records in de tabel mogen? is het soms een extreem grote tabel die VEEL diskspace per row in neemt ofzo? anders is dit onzinnig geneuzel, laat die data er lekker in staan.

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Als je dit query alleen uitvoerd nadat je de gegevens hebt gewijzigd valt het allemaal best wel mee. Verder is zijn vraag gewoon of het kan, het antwoord is ja. Het is allicht leuk om het een keertje te proberen en de eventuele problemen hiet weer te posten, al doende leert men.

Ook kun je hiermee een beetje met table locks oefent wat wel eens interessant kan zijn. Het is zomaar de manier waarop je er tegenaan kijkt.

Verwijderd

Gewoon 2 query's uitvoeren:
1 die selecteerd de laatste row die je er nog in wilt hebben;
en 1 die de rest verwijderd.

Als je met unieke ID's (autoincr.) werkt:

PHP:
1
2
$query[1] = "SELECT id FROM tablename ORDER BY id DESC LIMIT 25,1";
$query[2] = "DELETE FROM tablename WHERE ID < " . $resultaat_van_hierboven . "";


Toch?

[ Voor 20% gewijzigd door Verwijderd op 23-08-2003 12:06 ]


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Het nadeel is dat je problemen krijgt als je meerdere gebruikers hebt die aan het invoeren zijn. Je zult je table dus toch eerst moeten locken en natuurlijk ook weer vrijgeven.

Verwijderd

djluc schreef op 23 augustus 2003 @ 12:29:
Het nadeel is dat je problemen krijgt als je meerdere gebruikers hebt die aan het invoeren zijn. Je zult je table dus toch eerst moeten locken en natuurlijk ook weer vrijgeven.
Als jij zoveel bezoekers hebt dat je daar last van hebt dan heb je een beste website draaien... (-:

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Ik ga echt niet proggen op een manier waarbij ik niet zeker ben als het ook veilig kan.

  • brokenp
  • Registratie: December 2001
  • Nu online
Is het niet beter om voor het inserten even de count van de tabel op te vragen? en te bepalen of er uberhaupt wel toegevoegd mag worden? en mogen er willekeurige records verwijderd worden?
Ik zou sowieso niet werken met een methode die gebruik maakt van Id's van autoincrementvelden, aangezien je nooit weet of dit klopt...
Dit is mijn voorstel in semi-php
PHP:
1
2
$query[1] = "SELECT count(*) FROM tablename";
$query[2] = "DELETE FROM tablename LIMIT " . querie[1]-25

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Wat gebeurt er dan als je een gat in je index hebt? Juist ja, dan gaat het dus alsnog fout. Je mag er trouwens nooit vanuit gaan dat de records in de juiste volgorde terugkomen als je niet order by doet.

Verwijderd

Hm.

Als ik een tabel heb met 40 rows met unieke (door autoincr. geplaatste) ID's en ik doe dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// ----------------------------
// hier nog even een DB connectie maken
// ----------------------------

// grens ID in $data['id'] stoppen
$query[1] = "SELECT id FROM tablename ORDER BY id DESC LIMIT 25,1";
if (!$result[1] = mysql_query($query[1]))
exit ("Er gaat iets mis: error 1.");
$data = mysql_fetch_array($querry[1]);

// alle rijen die een lager ID dan het hierboven bepaalde grensID hebben verwijderen
$query[2] = "DELETE FROM tablename WHERE id < " . $data['id'];
if (!mysql_query($query[2]))
exit ("Er gaat iets mis: error 2.");

// melding doen dat het gelukt is :) een totaal aantal rijen laten zien
$query[3] = "SELECT count(*) FROM tablename";
if (!$aantalRijen = mysql_query($query[3]))
exit ("Er gaat iets mis: error 3.");
echo "<b>De rijen zijn verwijderd!</b><br>";
echo "Er zitten: <b>" . $aantalRijen . "</b> rijen in de tabel " . $tablename . ".";

// ----------------------------
// hier nog even een DB connectie sluiten
// ----------------------------


..dan maakt het toch echt niets uit wat voor ID's de rijen hebben, als ze maar oplopen (waarbij de recenste rij de hoogste ID moet hebben, maar dit is vanzelfsprekend bij een goede tabel en goede scripts die met de tabel werken).

Er werd als argument gegeven dat je per ongeluk een rij kan toevoegen met een ander ID dan de autoincr. ID maar dan ligt dit toch echt aan je scripts!

PS: in het geval hierboven maakt het toch echt niet uit of de ID's gaten bevatten (40, 39, 12, 11, 10, enz). Hij zorgt gewoon dat de recenste 25 rijen blijven bestaan.

En als er gezeur komt over de ID's, dan doe je toch lekker bij elke INSERT de datum erin stoppen? Ga je daarmee werken.

[ Voor 11% gewijzigd door Verwijderd op 23-08-2003 16:53 ]


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
kan het niet gewoon zo :p :+
SQL:
1
2
3
4
DELETE
FROM tabel
ORDER BY timestamp DESC
LIMIT 25,-1

Pas de replâtrage, la structure est pourrie.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Apollo_Futurae schreef op 24 August 2003 @ 13:54:
kan het niet gewoon zo :p :+
SQL:
1
2
3
4
DELETE
FROM tabel
ORDER BY timestamp DESC
LIMIT 25,-1
Ik denk dat je zo weleens heel misschien vrijwel zeker gelijk zou kunnen hebben :+

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Afgezien van het feit dat het vrij raar is om max 25 records in een tabel te willen hebben natuurlijk ;)

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Tsja je moet toch wat bedenken om ons allen hier in /14 bezig te houden.

offtopic:
ACM, je icon en antimysql page werken niet

Verwijderd

Megamind: Ik heb een database en ik wil dat er maximaal 25 rows in de tabel blijven staan. Maar met welke query kan ik dat simpel doen?
Zoiets?
MySQL:
1
2
3
INSERT INTO ... (...)
    VALUES (...)
    ON DUPLICATE KEY UPDATE x = (x + 1) % 25
Met dank aan #devschuur _/-\o_

[ Voor 2% gewijzigd door Verwijderd op 24-08-2003 15:59 . Reden: layout is heilig ]


  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07

BKJ

Apollo_Futurae schreef op 24 August 2003 @ 13:54:
kan het niet gewoon zo :p :+
SQL:
1
2
3
4
DELETE
FROM tabel
ORDER BY timestamp DESC
LIMIT 25,-1
ik zou daar LIMIT 26,-1 van maken....

Kamer huren


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
hitchhacker schreef op 24 August 2003 @ 16:08:
ik zou daar LIMIT 26,-1 van maken....
ik niet ;)

"The offset of the initial row is 0 (not 1)"
zie hier

Pas de replâtrage, la structure est pourrie.


  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07

BKJ

Apollo_Futurae schreef op 24 August 2003 @ 16:20:
[...]

ik niet ;)

"The offset of the initial row is 0 (not 1)"
zie hier
d'oh...natuurlijk..ook om enige consistentie met array nummering te houden.
Ik denk "ik weet ook wat" :P

Kamer huren

Pagina: 1