Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 5%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 392 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

1 Zum Seitenanfang

Donnerstag, 27. Mai 2004, 19:53

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?
 

Shurakai

Foren Gott

Dabei seit: 05.02.2003

Beiträge: 2 181

 

2 Zum Seitenanfang

Donnerstag, 27. Mai 2004, 20:21

So direkt gar nicht, denn es ist ja Sinn und Zweck von AUTO_INCREMENT dass es immer weiter hochgezählt wird...
 

Fab

Lebende Foren Legende

Dabei seit: 30.03.2003

Beiträge: 1 635

 

3 Zum Seitenanfang

Donnerstag, 27. Mai 2004, 20:25

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. :D

Mfg Fab
 

Max

Tripel-As

Dabei seit: 02.12.2002

Beiträge: 191

 

4 Zum Seitenanfang

Donnerstag, 27. Mai 2004, 21:15

Du kannst aucg sagen als Query gesehen:
ORDER BY rand() WHERE id > x AND id < y

MfG Max
 

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

5 Zum Seitenanfang

Freitag, 28. Mai 2004, 13:01

@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
 

Fab

Lebende Foren Legende

Dabei seit: 30.03.2003

Beiträge: 1 635

 

6 Zum Seitenanfang

Freitag, 28. Mai 2004, 17:51

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à :D

Mfg Fab
 

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

7 Zum Seitenanfang

Freitag, 28. Mai 2004, 20:04

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?
 

Fab

Lebende Foren Legende

Dabei seit: 30.03.2003

Beiträge: 1 635

 

8 Zum Seitenanfang

Freitag, 28. Mai 2004, 21:50

Hi

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
 

Max

Tripel-As

Dabei seit: 02.12.2002

Beiträge: 191

 

9 Zum Seitenanfang

Freitag, 28. Mai 2004, 21:52

ORDER BY rand() WHERE id > x AND id < y LIMIT DEINEANZAHL

MfG Max
 

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

10 Zum Seitenanfang

Freitag, 28. Mai 2004, 22:39

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 :P

Bitte keine Doppelposts!
Mfg Heinervdm

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »heinervdm« (29. Mai 2004, 14:00)

 

MartyMcFly

Foren Gott

Dabei seit: 04.06.2003

Beiträge: 3 137

 

11 Zum Seitenanfang

Samstag, 29. Mai 2004, 12:48

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
 

lorenz

Haudegen

Dabei seit: 05.11.2002

Beiträge: 647

 

12 Zum Seitenanfang

Samstag, 29. Mai 2004, 13:13

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
 

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

13 Zum Seitenanfang

Samstag, 29. Mai 2004, 18:15

is ne gute idee und funktioniert. hätte ich eigentlich selbst drauf kommen können :D

@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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »spida« (30. Mai 2004, 14:18)

 

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

14 Zum Seitenanfang

Montag, 31. Mai 2004, 12:50

is ne gute idee und funktioniert. hätte ich eigentlich selbst drauf kommen können :D

@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 ;-)
 

lorenz

Haudegen

Dabei seit: 05.11.2002

Beiträge: 647

 

15 Zum Seitenanfang

Montag, 31. Mai 2004, 12:57

na wenn du den fehler hier mal hinschreiben würdest wärs einfach


ich schreib für delete immer :


DELETE FROM $table WHERE ID = '$ID';

mfG LA
 

spida

Mitglied

Dabei seit: 31.01.2004

Beiträge: 46

 

16 Zum Seitenanfang

Montag, 31. Mai 2004, 13:09

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
 

Ähnliche Themen