Sneapi: Ganzen Inhalt aus Tabelle löschen?

Hallo Leute,

ich hab in meiner DB eine Tabelle mit dem namen user_online und ich würde gerne den gesamten Inhalt der tabelle löschen so das alle Einträge leer sind.
Kann mir da jemand helfen?
Leider bin ich nicht gut in PHP und mit Datenbanken erst recht nicht.

Die Tabelle hab ich hier nach erzeugt:

  
CREATE TABLE `onlineuser` (  
    id INT(11) DEFAULT '0' NOT NULL auto_increment,  
    uid CHAR(32),  
    ip CHAR(15),  
    time INT(11),  
    PRIMARY KEY (id)  
);  

und wie gesagt soll jetzt der inhalt von id, uid, ip und time gelöscht werden.

Danke schon mal an alle für eure Hilfe.

Mfg

  1. Mahlzeit Sneapi,

    ich hab in meiner DB eine Tabelle mit dem namen user_online und ich würde gerne den gesamten Inhalt der tabelle löschen so das alle Einträge leer sind.

    Tja - hättest Du den Namen und die Version Deiner Datenbank genannt, könnte man Dir auch helfen ...

    ... aber ich bin da mal nicht so. Da ich davon ausgehen, dass Du MySQL im Einsatz hast, solltest Du Dir vielleicht mal die Syntax des DELETE-Statements zu Gemüte führen.

    und wie gesagt soll jetzt der inhalt von id, uid, ip und time gelöscht werden.

    Von *allen* Datensätzen?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hoi!

      und wie gesagt soll jetzt der inhalt von id, uid, ip und time gelöscht werden.

      Von *allen* Datensätzen?

      Das verstehe ich unter gesamten Inhalt loeschen. Der kleine Nebensatz "so dass alle Eintraege leer sind" verwirrt mich allerdings etwas. Das klingt nicht nach loeschen sondern ueberschreiben.

      --
      "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
            - T. Pratchett
      1. Das verstehe ich unter gesamten Inhalt loeschen. Der kleine Nebensatz "so dass alle Eintraege leer sind" verwirrt mich allerdings etwas. Das klingt nicht nach loeschen sondern ueberschreiben.

        Den Primärschlüssel in jedem Datensatz mit einem Leerstring überschreiben dürfte aber etwas schwierig werden :D

        1. Moin,

          Den Primärschlüssel in jedem Datensatz mit einem Leerstring überschreiben dürfte aber etwas schwierig werden :D

          Jupp. Du weisst des, ich weiss des, weiss Sneapi des auch? Ich bin fast schon gespannt, ob es noch ne Antwort gibt.

          --
          "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                - T. Pratchett
  2. Kann mir da jemand helfen?

    In der Annahme du verwendest MySQL kann dir sicher das Handbuch helfen.

  3. Hi!

    Kein Problem:

    http://www.google.de/search?hl=de&source=hp&q=mysql+delete

    Gleich der erste Eintrag ist ein Volltreffer: http://dev.mysql.com/doc/refman/5.1/de/delete.html

    Wie lange hast Du gebraucht, die Frage hier zu posten? ;)

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
    1. Hi!

      Kein Problem:

      http://www.google.de/search?hl=de&source=hp&q=mysql+delete

      Gleich der erste Eintrag ist ein Volltreffer: http://dev.mysql.com/doc/refman/5.1/de/delete.html

      Wie lange hast Du gebraucht, die Frage hier zu posten? ;)

      Danke hat geholfen.

        
      @mysql_query("DELETE FROM " . $tabelle) or die(mysql_error());  
      
      

      Mfg

      1. Danke hat geholfen.

        Keine Ursache. Die Doku erklaert solche Standardgeschichten oft besser, als man das in einem Forum erwarten darf. ;)

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
      2. Mahlzeit Sneapi,

        @mysql_query("DELETE FROM " . $tabelle) or die(mysql_error());

          
        [Zitat 1282](http://community.de.selfhtml.org/zitatesammlung/zitat1282) ... Du solltest statt des @ und des überflüssigen die() lieber ein halbwegs vernünftiges Fehlerbehandlungskonzept einbauen - anfangen könntest Du z.B. damit, den Rückgabewert von [mysql_query()](http://de2.php.net/manual/de/function.mysql-query.php) sinnvoll auszuwerten.  
          
          
        MfG,  
        EKKi  
        
        -- 
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        
  4. Hi!

    ich hab in meiner DB eine Tabelle mit dem namen user_online und ich würde gerne den gesamten Inhalt der tabelle löschen so das alle Einträge leer sind.

    Alle verweisen bisher auf das Handbuchkapitel zu DELETE. Auch als Antwortender kann man manchmal noch was lernen, wenn man die Verweise auch selbst liest. Beispielsweise, dass bei einem Komplett-Leeren TRUNCATE schneller ist als DELETE, weil es die Tabelle löscht und neu erstellt, statt alle Datensätze einzeln und intern auf gelöscht zu setzen. Nebeneffekt: Man braucht auch kein OPTIMIZE TABLE, um den ehemals von den gelöschten Datensätze belegten Speicherplatz freizugeben.

    Lo!

    1. yo,

      Beispielsweise, dass bei einem Komplett-Leeren TRUNCATE schneller ist als DELETE, weil es die Tabelle löscht und neu erstellt, statt alle Datensätze einzeln und intern auf gelöscht zu setzen.

      möglich, das es geht, aber woher weisst du, dass auf die tabelle nicht referenziert wird. und falls es sich um eine script anweisung handelt, die dauerhaft ausgeführt werden soll musst du das auch für die zukunft sicher stellen. oder ob die anderen vorrausetzungen stimmen, damit man truncate einsetzen kann.

      Ilja

      1. Hi!

        Beispielsweise, dass bei einem Komplett-Leeren TRUNCATE schneller ist als DELETE, weil es die Tabelle löscht und neu erstellt, statt alle Datensätze einzeln und intern auf gelöscht zu setzen.
        möglich, das es geht, aber woher weisst du, dass auf die tabelle nicht referenziert wird.

        Ist das nicht egal? Gelöscht ist gelöscht, egal ob einzeln oder in einen Rutsch.

        und falls es sich um eine script anweisung handelt, die dauerhaft ausgeführt werden soll musst du das auch für die zukunft sicher stellen. oder ob die anderen vorrausetzungen stimmen, damit man truncate einsetzen kann.

        Welche Voraussetzungen meinst du? Ein Foreign Key Constraint (natürlich nur bei InnoDB) wird von MySQL auch beim TRUNCATE berücksichtigt.

        Lo!

        1. yo,

          Ist das nicht egal? Gelöscht ist gelöscht, egal ob einzeln oder in einen Rutsch.

          ganz und gar nicht. TRUNCATE und DELETE mögen schnittmengen haben, aber tun letztlich zwei verschiedene dinge. ich habe zwar in beiden fällen eine leere tabelle mit gleichen namen, ich habe aber nicht mehr die gleiche tabelle. die mysql doku suggeriert da was, was so nicht stimmt, zumal in der deutschen übersetzung meiner meinung nach auch ein fehler drin ist.

          dort steht: "Bei InnoDB-Tabellen wird TRUNCATE TABLE auf DELETE umgesetzt, sofern keine Fremdschlüssel-Constraints vorhanden sind, die die Tabelle referenzieren". das müsste aber genau umgekehrt sein.

          hinzu kommt, dass bei einem TRUNCATE der autoincrement wert sich resetet, die meta daten sollten sich auch verändern, es wird ein impliziter commit ausgeführt (DDL Statement) und delete triggers nicht gefeuert. das es keinen rückegabewert der gelöschten datensätze gibt, ist wohl noch der kleineste unterschied. aber davon zu reden, es wäre das gleiche, dem will ich so nicht zustimmen. man muss da sehr genau klären, ob es das richtige ist.

          Ilja

          1. Hi!

            Die Ausgangsfrage war:

            aber woher weisst du, dass auf die tabelle nicht referenziert wird.
            Ist das nicht egal? Gelöscht ist gelöscht, egal ob einzeln oder in einen Rutsch.
            ganz und gar nicht. TRUNCATE und DELETE mögen schnittmengen haben, aber tun letztlich zwei verschiedene dinge.

            Man kann das auch so sehen, dass sie das gleiche tun, aber mit unterschiedlichen Nebenwirkungen. Wie auch immer, mit der Ausgangsfrage hat das nicht mehr viel zu tun. Als Anwender muss ich zur Entscheidung, ob ich DELETE oder TRUNCATE verwende, nicht die Referenzlage berücksichtigen (so man denn überhaupt InnoDB verwendet). Das macht MySQL schon von selbst. Andere Kriterien: siehe unten.

            ich habe zwar in beiden fällen eine leere tabelle mit gleichen namen, ich habe aber nicht mehr die gleiche tabelle.

            Was hat das für praktische Auswirkungen ob die Tabelle die selbe ist oder eine genaue Kopie? Abgesehen von den dokumentierten Details in den Nebenwirkungen.

            die mysql doku suggeriert da was, was so nicht stimmt,

            Das kann ich nicht daraus entnehmen, sie listet sehr genau die Unterschiede zwischen beiden Verfahren auf. Gleich zu Anfang wird darauf in einem Atemzug hingewiesen: "Logically, TRUNCATE TABLE is equivalent to a DELETE statement that deletes all rows, but there are practical differences under some circumstances." (auch in der Übersetzung)

            zumal in der deutschen übersetzung meiner meinung nach auch ein fehler drin ist.

            Deswegen vermeide ich, im fachlichen Bereich Übersetzungen zu verwenden.

            dort steht: "Bei InnoDB-Tabellen wird TRUNCATE TABLE auf DELETE umgesetzt, sofern keine Fremdschlüssel-Constraints vorhanden sind, die die Tabelle referenzieren". das müsste aber genau umgekehrt sein.

            Das "keine" ist zu viel. Das Original liest sich auch anders. Die Übersetzung ist jedenfalls inhaltlich nicht (mehr) auf dem 1:1-Stand. Ich verfolge die Änderungen im deutschen Teil nicht, aber mir scheint, dass seit der Übersetzung viele Dinge (Kapitelstruktur und Inhalt) im Original geändert jedoch in der deutschen Übersetzung nicht nachgezogen wurden.

            hinzu kommt, dass bei einem TRUNCATE der autoincrement wert sich resetet, die meta daten sollten sich auch verändern, es wird ein impliziter commit ausgeführt (DDL Statement) und delete triggers nicht gefeuert. das es keinen rückegabewert der gelöschten datensätze gibt, ist wohl noch der kleineste unterschied. aber davon zu reden, es wäre das gleiche, dem will ich so nicht zustimmen. man muss da sehr genau klären, ob es das richtige ist.

            Das steht ja alles so in der Dokumentation (zumindest in der englichen), und das sind in meinen Augen alles mehr oder weniger Kleinigkeiten. Auf geschätzt 90% der Anwender MySQLs, die komplette Tabellen löschen wollen, werden die Unterschiede keine Auswirkungen haben.

            Auf alle Fälle ist es eine Alternative zu DELETE, die nicht unerwähnt bleiben sollte. Die Entscheidung muss letztlich immer der Verwender selbst treffen. Dass die Unterschiede oder besser gesagt die Eigenschaften von als Antwort Genanntem selten bis nie bis ins kleinste Detail aufgeführt werden, würde ich niemandem ankreiden wollen, solange sie nicht für Aspekte der Frage oder aus der allgemeinen Erfahrung heraus wichtig sind.

            Lo!

            1. yo,

              Das steht ja alles so in der Dokumentation (zumindest in der englichen), und das sind in meinen Augen alles mehr oder weniger Kleinigkeiten. Auf geschätzt 90% der Anwender MySQLs, die komplette Tabellen löschen wollen, werden die Unterschiede keine Auswirkungen haben.

              kleingikeiten mit nichten, alleine schon nicht wegen des impliziten commits. das kann "tödlich" sein. und selbst wenn es nur 10% sind, die probleme damit haben, das muss beachtet werden, eventuell ist ein delete trigger, der in eine log tabelle schreibt, etc. es ist definitiv nicht das gleiche und das sollte man ganz bewußt sagen. ich will es mal so sagen, wenn ich TRUNCATE nicht ganz beußt einsetze und alle unterschiede kenne, würde ich es vermeiden als ersatz für DELETE einzusetzen.

              Auf alle Fälle ist es eine Alternative zu DELETE, die nicht unerwähnt bleiben sollte. Die Entscheidung muss letztlich immer der Verwender selbst treffen.

              eine alternative auf jeden fall, aber eben nicht das gleiche.

              Ilja

              1. Hi!

                kleingikeiten mit nichten,

                Was du mit deinen Nichten anstellst, ist mitnichten von Belang. :-)

                alleine schon nicht wegen des impliziten commits. das kann "tödlich" sein.

                Auf der DELETE-Seite steht, dass TRUNCATE sowieso nicht in Transactionen ausgeführt werden kann. Auf der TRUNCATE-Seite das mit dem impliziten Commit. Allerdings steht da auch drüber: "For other storage engines" und oben drüber ging es um InnoDB. Wenn sich also der implizite Commit nicht auf InnoDB bezieht, dann ist das praktisch komplett vernachläsigbar, weil MyISAM keine Transaktionen und damit kein Commit kann, und die anderen Engines noch seltener als InnoDB verwendet werden.

                ich will es mal so sagen, wenn ich TRUNCATE nicht ganz bewußt einsetze und alle unterschiede kenne, würde ich es vermeiden als ersatz für DELETE einzusetzen.

                Du argumentiert ja mit einer Heftigkeit als ob TRUNCATE der Teufel persönlich ist (das aber vermutlich mit deinem Hintergrundwissen, das hauptsächlich aufgrund des professionellen Einsatzes anderer Systeme und weniger aus der Sicht des typischen MySQL-Anwenders begründet ist). Wer soweit fortgeschritten ist, dass er Transaktionen und Trigger verwendet, muss meiner Meinung nach auch in der Lage sein, Informationen in Handbüchern zu finden und bei Tests der Funktionalität unerwünschte Nebenwirkungen erkennen zu können (wenn er lieber nach der Trial-and-Error-Methode lernt).

                Lo!

                1. yo,

                  Du argumentiert ja mit einer Heftigkeit als ob TRUNCATE der Teufel persönlich ist

                  dann ist ein falscher eindruck entstanden, TRUNCATE hat sein einsatzgebiet. aber nicht als gleichwertige alternative zu DELETE. sicherlich kann man fälle konstruieren, wo es im ergebnis ähnlich ist. und diese mögen bei mysql auch in der mehrheit sein. aber trotzdem sind es unterschiedliche vorgänge, löschen einer tabelle und löschen von datensätzen. auch bin ich ein fan davon, neben der besonderheiten eines dbms auch ein wenig über diese welt hinaus zu schauen.

                  Wer soweit fortgeschritten ist, dass er Transaktionen und Trigger verwendet, muss meiner Meinung nach auch in der Lage sein, Informationen in Handbüchern zu finden und bei Tests der Funktionalität unerwünschte Nebenwirkungen erkennen zu können.

                  jemand, der deine erfahrungen hat, und das auch ganz besonders bezüglich des dbms mysql, sollte andere darauf hinweisen, dass es eine alternative gibt, aber es sich unterscheidet. du hast ja schon auf einen nebeneffekt explizit bei deinem erst post hingewiesen, warum nicht auch auf die anderen, wo sich die DELETE anweisung von dem TRUNCATE befehl unterscheidet ?

                  Ilja

                  1. Hi!

                    jemand, der deine erfahrungen hat, und das auch ganz besonders bezüglich des dbms mysql, sollte andere darauf hinweisen, dass es eine alternative gibt, aber es sich unterscheidet. du hast ja schon auf einen nebeneffekt explizit bei deinem erst post hingewiesen, warum nicht auch auf die anderen, wo sich die DELETE anweisung von dem TRUNCATE befehl unterscheidet ?

                    Ich hatte noch nie einen Einsatzfall für TRUNCATE oder das Löschen aller Datensätze, der sich nicht mit dem phpMyAdmin erledigen ließe. Die einzige für die hauptsächliche Zielgruppe relevante Nebenwirkung (nach meiner Meinung) wäre das Rücksetzen des auto_increment-Zählers. Der hat mich in meinen Fällen nicht interessiert und so war mir dieser Unterschied bis dato nicht bewusst. Ich wusste - aus welchem Anlass auch immer - nur, dass es TRUNCATE gibt und es schneller als DELETE ist.

                    Aber gut, nun weiß ich erstmal ein paar Details mehr, die ich vermutlich nie in der MySQL-Praxis benötigen werde.

                    Lo!

                    1. yo,

                      Die einzige für die hauptsächliche Zielgruppe relevante Nebenwirkung (nach meiner Meinung) wäre das Rücksetzen des auto_increment-Zählers.

                      sei ja mal dahingestellt, ob es der einzig relevante teil ist. das ist aber abhängig von der jeweiligen situation und sollte somit auch immer mitgeteilt werden. mysql geht oft eigene wege, manche gut, manche weniger gut. gerade dieses vermischen, ich gebe TRUNCATE ein und er macht daraus ein DELETE, wenn es abhängigkeiten auf die tabelle gibt, finde ich nicht sonderlich gut gemacht. oracle würde es schlicht verweigern, den TRUNCATE auszuführen. es ist eben nicht das gleiche und man sollte auch nicht so tun, als wäre es das gleiche, auf wenn beides seine berechtigung hat.

                      Ich wusste - aus welchem Anlass auch immer - nur, dass es TRUNCATE gibt und es schneller als DELETE ist.

                      naja, du hast den anderen ja den tipp gegeben, die doku zu lesen....

                      Aber gut, nun weiß ich erstmal ein paar Details mehr, die ich vermutlich nie in der MySQL-Praxis benötigen werde.

                      mysql ist nicht die ganze welt, dieses wissen zu haben ist immer nützlich und ich finde uch im mysql umfeld sehr hilfreich.

                      Ilja