Leere Ids bei MySQL
HEY!
Ich hab folgendes Problem:
Wenn ich folgende Tabelle (Auszug) mit MySQL erstelle...
ID INT AUTO_INCREMENT,
PRIMARY KEY(ID)
...wird ja immer automatisch eine ID vergeben.
Wenn man jetzt aber eine löscht (ID), dann ist die Reihenfolge z.B. 1,2,3,5,6,8,9...
das heißt ich hab da manchmal eine Lücke. Das macht sich aber schlecht, wenn ich diese IDs für einen Zufallsmodus verwenden möchte, bei dem ich Start- und Endwert eingeben muss.
Wie kann ich also verhindern, dass es "leere" IDs gibt?
Ich hab folgendes Problem:
Wenn ich folgende Tabelle (Auszug) mit MySQL erstelle...
ID INT AUTO_INCREMENT,
PRIMARY KEY(ID)
...wird ja immer automatisch eine ID vergeben.
Wenn man jetzt aber eine löscht (ID), dann ist die Reihenfolge z.B. 1,2,3,5,6,8,9...
das heißt ich hab da manchmal eine Lücke. Das macht sich aber schlecht, wenn ich diese IDs für einen Zufallsmodus verwenden möchte, bei dem ich Start- und Endwert eingeben muss.
Wie kann ich also verhindern, dass es "leere" IDs gibt?
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
Du könntest es ja so machen, dass du den zu löschenden Datensatz einfach mit dem am Ende plazierten Datensatz ersetzt. Also du löschts dann so zu sagen immer den letzten Datensatz.
So entsteht keine Lücke und AUTO_INCREMENT bockt auch nicht.
Mfg Fab
So entsteht keine Lücke und AUTO_INCREMENT bockt auch nicht.

Mfg Fab
-->Vokaline - schneller und effizienter Wörter lernen<-- (kostenlos!)
@Fab
und wie mache ich das?
@Max
das klappt aber nicht mehr, wenn ich beispielsweise zwei zufalls-id haben möchte.
denn da brauch ich ja ein array mit allen ids. weißt du wie das geht? das ich mir also über mysql alle vorhandenen ids einzeln ausspucken lasse?
MfG Matze
und wie mache ich das?
@Max
das klappt aber nicht mehr, wenn ich beispielsweise zwei zufalls-id haben möchte.
denn da brauch ich ja ein array mit allen ids. weißt du wie das geht? das ich mir also über mysql alle vorhandenen ids einzeln ausspucken lasse?
MfG Matze
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
Ganz einfach,
du löschst den Datensatz mit DELETE den du nicht mehr haben willst, speicherst aber die ID zuerst in eine Variable.
Jetzt kopierst du den Inhalt des letzten Datensatzes (Inhalt fetchen) in eine oder mehrere Variablen (für jede Zelle eine Variable) und löschst diesen mit DELETE anschliessend.
Danach kannst du mit INSERT die Variablen des letzten Datensatzes in die ID des am Anfang gelöschten Datensatzes (also in die Lücke) einfügen.
Voilà
Mfg Fab
du löschst den Datensatz mit DELETE den du nicht mehr haben willst, speicherst aber die ID zuerst in eine Variable.
Jetzt kopierst du den Inhalt des letzten Datensatzes (Inhalt fetchen) in eine oder mehrere Variablen (für jede Zelle eine Variable) und löschst diesen mit DELETE anschliessend.
Danach kannst du mit INSERT die Variablen des letzten Datensatzes in die ID des am Anfang gelöschten Datensatzes (also in die Lücke) einfügen.
Voilà

Mfg Fab
-->Vokaline - schneller und effizienter Wörter lernen<-- (kostenlos!)
mein zeil war ja eine mehr automatische Vorrichtung. So wie du das aber erklärt hast, hätte ich keinen plan, wie ich das anstellen sollte.
also wie kann ich daraus einen automatischen vorgang machen? oder geht das nicht?
also wie kann ich daraus einen automatischen vorgang machen? oder geht das nicht?
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
Hi
Ich denke, dass isch das Scirpt von selber erklärt. (->siehe Kommentare)
Wenn du fragen hast, einfach stellen,
Mfg Fab
|
|
PHP-Quelltext |
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?php
$host = "";
$user = "";
$pw = "";
$db = "";
$table = "Zufall";
// connecten
mysql_connect($host,$user,$pw) OR die(mysql_error());
mysql_select_db($db) OR die(mysql_error());
// ID wählen & speichern
$sql = "SELECT
ID
FROM
".$table."
WHERE
link = '".$_POST['link']."';"; /* Hier musst du halt einfach von einem anderen Feld die ID des zu löschenden Datensatzes herausfinden (wird hier per Forumal übergeben) */
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
$ID = $row['ID'];
// Datensatz löschen
$sql = "DELETE * FROM
".$table."
WHERE
ID = '".$ID."';";
$result = mysql_query($sql) OR die(mysql_error());
$anzahl = mysql_num_rows($result);
// letzen Datensatz auslesen
$sql = "SELECT
link
FROM
".$table."
WHERE
ID = '".$anzahl."';";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
$temp = $row['link'];
// letzten Datensatz löschen
$sql = "DELETE * FROM
".$table."
WHERE
ID = '".$ID."';";
$result = mysql_query($sql) OR die(mysql_error());
// ersetzten...
$sql = "INSERT INTO ".$table."
(ID,link)
VALUES
(".$ID.",".$temp.");";
$result = mysql_query($sql) OR die(mysql_error());
// fertig
?>
|
Ich denke, dass isch das Scirpt von selber erklärt. (->siehe Kommentare)
Wenn du fragen hast, einfach stellen,

Mfg Fab
-->Vokaline - schneller und effizienter Wörter lernen<-- (kostenlos!)
cool, danke!
ich werds gleich mal ausprobieren und mich bei fragen noch mal melden!
;-)
Nachtrag:
Jetzt hab ich doch ein Problem:
Wenn eine ID gelöscht wird, scheint MySQL sich das zu merken und sagen wir mal die letzte id war 6 und die 7 hab ich gelöscht.
dann benennt er die nächste id mit 8
wie kann ich das verhindern?
und noch was an max:
wofür steht x und wofür y? vielleicht stell ich mich ja ein bissl blöd an, ich hoffe ich verzeiht mir
ich werds gleich mal ausprobieren und mich bei fragen noch mal melden!
;-)
Nachtrag:
Jetzt hab ich doch ein Problem:
Wenn eine ID gelöscht wird, scheint MySQL sich das zu merken und sagen wir mal die letzte id war 6 und die 7 hab ich gelöscht.
dann benennt er die nächste id mit 8
wie kann ich das verhindern?
und noch was an max:
wofür steht x und wofür y? vielleicht stell ich mich ja ein bissl blöd an, ich hoffe ich verzeiht mir

Bitte keine Doppelposts!
Mfg Heinervdm
Mfg Heinervdm
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »heinervdm« (29. Mai 2004, 14:00)
Hallo,
nur mal eine Anmerkung zu diesen Dingen: Ihr wisst schon, dass dieses Verhalten des auto-increment so gewollt ist und alles andere keinen Sinn macht? Wenn man abhängige Tabellen hat zu dieser Tabelle, in denen der Schlüssel genau dieses ID-Feld ist, kommt das zu Problemen, wenn IDs nach dem Löschen wieder belegt werden.
Datenkonsistenz ist das dann nicht mehr und Normalformen könnt ihr dann auch nciht nutzen.
Gruss
Marty
nur mal eine Anmerkung zu diesen Dingen: Ihr wisst schon, dass dieses Verhalten des auto-increment so gewollt ist und alles andere keinen Sinn macht? Wenn man abhängige Tabellen hat zu dieser Tabelle, in denen der Schlüssel genau dieses ID-Feld ist, kommt das zu Problemen, wenn IDs nach dem Löschen wieder belegt werden.
Datenkonsistenz ist das dann nicht mehr und Normalformen könnt ihr dann auch nciht nutzen.
Gruss
Marty
also ich würd dir dann eifach raten das du halt keine auto id hast und dir dafür slebt ne funktion schriebst die
wenn du neuen datensatz anlegst einfach alle nachzahlt also ne num_rows von allen datensätzen + 1 ist dann deine neue id.
und wenn du löschst musst du halt alle dadrüber liegen um eins nach unten setzten warscheinlich am einfachsten mit einer rekursiven function oder so
mfG LA
wenn du neuen datensatz anlegst einfach alle nachzahlt also ne num_rows von allen datensätzen + 1 ist dann deine neue id.
und wenn du löschst musst du halt alle dadrüber liegen um eins nach unten setzten warscheinlich am einfachsten mit einer rekursiven function oder so
mfG LA
is ne gute idee und funktioniert. hätte ich eigentlich selbst drauf kommen können 
@Max
Aber noch mal zu dir:
ORDER BY rand() WHERE id > x AND id < y LIMIT DEINEANZAHL
funktioniert bei mir nicht. auch wenn ich LIMIT weglasse und für x und y Zahlen einsetze funzt es nicht. woran liegt das?
oder gibt es noch ne andere art mehrer zufalls-ids aus ner tabelle zu bekommen?
Nochwas:
bei dem script fürs löschen von ids scheint was nicht zu stimmen:
DELETE * FROM '".$table."' WHERE ID '".$ID."';
(das von deinem script)
1. gibt es da einen SQL-Error nach DELETE
2. scheint $ID nicht zu existieren.
Was soll ich machen?

@Max
Aber noch mal zu dir:
ORDER BY rand() WHERE id > x AND id < y LIMIT DEINEANZAHL
funktioniert bei mir nicht. auch wenn ich LIMIT weglasse und für x und y Zahlen einsetze funzt es nicht. woran liegt das?
oder gibt es noch ne andere art mehrer zufalls-ids aus ner tabelle zu bekommen?
Nochwas:
bei dem script fürs löschen von ids scheint was nicht zu stimmen:
DELETE * FROM '".$table."' WHERE ID '".$ID."';
(das von deinem script)
1. gibt es da einen SQL-Error nach DELETE
2. scheint $ID nicht zu existieren.
Was soll ich machen?
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »spida« (30. Mai 2004, 14:18)
is ne gute idee und funktioniert. hätte ich eigentlich selbst drauf kommen können 
@Max
Aber noch mal zu dir:
ORDER BY rand() WHERE id > x AND id < y LIMIT DEINEANZAHL
funktioniert bei mir nicht. auch wenn ich LIMIT weglasse und für x und y Zahlen einsetze funzt es nicht. woran liegt das?
oder gibt es noch ne andere art mehrer zufalls-ids aus ner tabelle zu bekommen?
Nochwas:
bei dem script fürs löschen von ids scheint was nicht zu stimmen:
DELETE * FROM '".$table."' WHERE ID '".$ID."';
(das von deinem script)
1. gibt es da einen SQL-Error nach DELETE
2. scheint $ID nicht zu existieren.
Was soll ich machen?
P.S: Sorry wegen dem Doppelpost, aber ansonsten reagiert keiner...
der ältere kann gelöscht werden ;-)

@Max
Aber noch mal zu dir:
ORDER BY rand() WHERE id > x AND id < y LIMIT DEINEANZAHL
funktioniert bei mir nicht. auch wenn ich LIMIT weglasse und für x und y Zahlen einsetze funzt es nicht. woran liegt das?
oder gibt es noch ne andere art mehrer zufalls-ids aus ner tabelle zu bekommen?
Nochwas:
bei dem script fürs löschen von ids scheint was nicht zu stimmen:
DELETE * FROM '".$table."' WHERE ID '".$ID."';
(das von deinem script)
1. gibt es da einen SQL-Error nach DELETE
2. scheint $ID nicht zu existieren.
Was soll ich machen?
P.S: Sorry wegen dem Doppelpost, aber ansonsten reagiert keiner...
der ältere kann gelöscht werden ;-)
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
ich habe das original vom quelltext weiter unten benutze (natürlich mit meinen Daten und bekomme folgenden Fehler:
You have an error in your SQL syntax near '* FROM rotator_data WHERE ID ''' at line 1
Da man auch sieht, dass da steht WHERE ID '' kann man sich auch denken, dass diese Variable nicht richitg ist, was aber weniger das Problem sein sollte
You have an error in your SQL syntax near '* FROM rotator_data WHERE ID ''' at line 1
Da man auch sieht, dass da steht WHERE ID '' kann man sich auch denken, dass diese Variable nicht richitg ist, was aber weniger das Problem sein sollte
MfG Matze
kostenlos im Internet surfen... :D
kostenlos im Internet surfen... :D
Ähnliche Themen
-
PHP »-
Problem mit der Datenbank???
(20. Dezember 2007, 17:22)
-
PHP »-
Wie viel Traffic?
(7. September 2004, 14:38)
-
Datenbanken »-
[MySQL] Update von DB-Table
(4. August 2004, 16:48)
-
PHP »-
for-schleife >> wert erhöhen ???
(9. März 2004, 12:19)
-
PHP »-
Onlineshop selber programmieren...
(10. Februar 2003, 17:17)


