DROP TABLE löscht nicht die gespeicherten Daten

  • Hallo,

    wenn ich DROP TABLE verwende, löscht er nur die Tabellendefinition, aber nicht die Daten. Weiß jemand woran das liegen kann?

    Spoiler anzeigen
    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hQuery, $aRow

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Open("HSN_TSN.db")

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Exec(-1, "CREATE TABLE Daten (HSN_TSN,Marke_Typ_Modell,Leistung,Hubraum,Kraftstoff);")
    _SQLite_Exec(-1, "INSERT INTO Daten (HSN_TSN,Marke_Typ_Modell,Leistung,Hubraum,Kraftstoff) VALUES ('0005/165','BMW 118 I','129 PS (95 kW)','1995 ccm','Benzin');")
    _SQLite_Exec(-1, "INSERT INTO Daten (HSN_TSN,Marke_Typ_Modell,Leistung,Hubraum,Kraftstoff) VALUES ('0005/166','BMW 120 I','150 PS (110 kW)','1995 ccm','Benzin');")

    [/autoit] [autoit][/autoit] [autoit]

    _SQlite_Query (-1, "SELECT * FROM Daten;", $hQuery)
    While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
    _ArrayDisplay($aRow,"")
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Exec(-1, "DROP TABLE Daten;")

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Close()
    _SQLite_Shutdown()

    [/autoit]

    Einmal editiert, zuletzt von m-obi (6. Mai 2013 um 17:57)

  • Ich hatte aber schon mehrfach gelesen, dass es auch die Einträge löscht. Wie sehe das denn aus mit dem Delete?

  • Also ich kann dein Problem nicht nachvollziehen. Bei mir sind in der Datei mit_Drop_Table.db keine Datensätze mehr vorhanden. -Sqliteman-

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Das ist eine kleine Besonderheit von SQLite (weiß allerdings nicht ob es bei anderen DBMS ähnlich läuft).
    SQLite handelt ähnlich einem Dateisystem. Heißt: Daten werden nicht gelöscht sondern lediglich Ihr Platz zum späteren Überschreiben frei gegeben.
    Wenn man den freigegebenen Platz manuell löschen will dann haut man noch ein "VACUUM"-Befehl hintendran oder arbeitet mit "auto_vacuum".

    Zur Verdeutlichung:

    Spoiler anzeigen
    [autoit]

    #Include <Crypt.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $s_DBPath = "HSN_TSN.db"

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Startup()
    _SQLite_Open($s_DBPath)

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Exec(-1, "CREATE TABLE Daten (HSN_TSN,Marke_Typ_Modell,Leistung,Hubraum,Kraftstoff);")
    _SQLite_Exec(-1, "INSERT INTO Daten VALUES ('0005/165','BMW 118 I','129 PS (95 kW)','1995 ccm','Benzin');")
    _SQLite_Exec(-1, "INSERT INTO Daten VALUES ('0005/166','BMW 120 I','150 PS (110 kW)','1995 ccm','Benzin');")
    MsgBox(0,"", StringFormat("Vor DROP Table:\n\nDateigröße:\t %6d bytes\nmd5-Hash:\t%s", FileGetSize($s_DBPath), _Crypt_HashFile($s_DBPath, $CALG_MD5)))

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Exec(-1, "DROP TABLE Daten;")
    MsgBox(0,"", StringFormat("Nach DROP Table:\n\nDateigröße:\t %6d bytes\nmd5-Hash:\t%s", FileGetSize($s_DBPath), _Crypt_HashFile($s_DBPath, $CALG_MD5)))

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Exec(-1, "VACUUM;")
    MsgBox(0,"", StringFormat("Nach VACUUM:\n\nDateigröße:\t %6d bytes\nmd5-Hash:\t%s", FileGetSize($s_DBPath), _Crypt_HashFile($s_DBPath, $CALG_MD5)))

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Close()
    _SQLite_Shutdown()

    [/autoit]

    Edit: bei PostgreSQL läuft es ähnlich.

    Einmal editiert, zuletzt von AspirinJunkie (6. Mai 2013 um 09:15)

  • TRUNCATE TABLE - löscht den kompletten inhalt, falls du das zuerst ausführen willst und dann DROP TABLE :)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • dann kann man bestimmt ein alias auf "DELETE FROM table;" erstellen, dann funzt truncate auch ;)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hallo,
    bevor es los geht mit Datenbanken (DB) könntest Du Dein SQLite updaten ( http://www.sqlite.org/ ).
    DB sind zum Speichern und verwalten großer Datenmengen. Die Daten werden nicht sortiert.

    DB stellen ein unabhängiges System dar, die sogar eine eigene Sprache mitbringen - SQL!
    Eine DB entwickeln würde ich, also separat von den Sprachen, wie C++, Java oder Autoit ( siehe auch http://www.ruhrtaler-softwareschmiede.de/bitmagie/sqlite ).
    Eine vorhandene DB lässt sich, dann von allen Sprachen ansprechen (wie C++, PHP, Java oder Autoit).

    zweiTabellen_3.SQL


    -- Als zweiTabellen_3.SQL speichern --
    -- Tabelle 'pflanzen' erzeugen --
    CREATE TABLE pflanzen (
    ID INTEGER PRIMARY KEY,
    Name text NOT NULL COLLATE nocase,
    Art_Nr INTEGER REFERENCES pflanzen_art(Art_Nr) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
    Farbe text NOT NULL DEFAULT 'grün',
    Geschmack text NOT NULL DEFAULT 'sauer',
    Groesse text NOT NULL DEFAULT 'klein',
    UNIQUE(Name,Art_Nr),
    CHECK(LENGTH(Name)>0)
    );

    -- Tabelle 'pflanzen_art' erzeugen --
    CREATE TABLE pflanzen_art (
    Art_Nr INTEGER PRIMARY KEY,
    Bezeichnung text NOT NULL COLLATE nocase
    );

    INSERT INTO pflanzen_art VALUES(1, 'Obst');
    INSERT INTO pflanzen_art VALUES(2, 'Gemüse');
    INSERT INTO pflanzen_art VALUES(3, 'Blumen');

    -- Daten in Tabelle 'pflanzen' einfuegen --
    INSERT INTO pflanzen VALUES(1, 'Ananas', 1, 'braun', 'süß', 'gross');
    INSERT INTO pflanzen VALUES(2, 'Apfel', 1, 'grün', 'sauer', 'mittel');
    INSERT INTO pflanzen VALUES(3, 'Banane',1, 'gelb', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(4, 'Birne',1, 'gelb', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(5, 'Brombeere',1, 'schwarz', 'sauer', 'klein');
    INSERT INTO pflanzen VALUES(41, 'Dattel',1, 'braun', 'süß','klein');
    INSERT INTO pflanzen VALUES(6, 'Erdbeere',1, 'rot', 'süß', 'klein');
    INSERT INTO pflanzen VALUES(7, 'Granatapfel',1, 'rot', 'sauer', 'mittel');
    INSERT INTO pflanzen VALUES(9, 'Grapefruit',1, 'gelb', 'sauer', 'mittel');
    INSERT INTO pflanzen VALUES(10, 'Himbeere',1, 'rot', 'süß', 'klein');
    INSERT INTO pflanzen VALUES(11, 'Kaki',1, 'orange', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(12, 'Kirsche',1, 'rot', 'süß', 'klein');
    INSERT INTO pflanzen VALUES(13, 'Kiwi',1, 'braun', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(14, 'Mandarine',1, 'orange', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(15, 'Mango',1, 'gelb', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(16, 'Maracuja',1, 'lila', 'sauer', 'mittel');
    INSERT INTO pflanzen VALUES(17, 'Nektarine',1, 'rot', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(18, 'Orange',1, 'orange', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(19, 'Papaya',1, 'orange', 'süß', 'gross');
    INSERT INTO pflanzen VALUES(20, 'Pfirsich',1, 'gelb', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(21, 'Plaume',1, 'lila', 'süß','klein');
    INSERT INTO pflanzen VALUES(22, 'Pomelo',1, 'gelb', 'süß', 'gross');
    INSERT INTO pflanzen VALUES(23, 'Quitte',1, 'gelb', 'sauer', 'mittel');
    INSERT INTO pflanzen VALUES(24, 'Sanddorn',1, 'orange', 'sauer', 'klein');
    INSERT INTO pflanzen VALUES(25, 'Schlehe',1, 'blau', 'sauer', 'klein');
    INSERT INTO pflanzen VALUES(26, 'Weintraube', 1, 'grün', 'süß', 'mittel');
    INSERT INTO pflanzen VALUES(27, 'Aubergine',2, 'lila', 'herzhaft', 'gross');
    INSERT INTO pflanzen VALUES(28, 'Blumenkohl',2, 'weiss', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(29, 'Brocoli',2, 'grün', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(30, 'Bohne',2, 'grün', 'herzhaft', 'klein');
    INSERT INTO pflanzen VALUES(31, 'Erbse',2, 'grün', 'herzhaft', 'klein');
    INSERT INTO pflanzen VALUES(32, 'Fenchel',2, 'grün', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(33, 'Karotte',2, 'orange', 'herzhaft','mittel');
    INSERT INTO pflanzen VALUES(34, 'Kartoffel',2, 'gelb', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(35, 'Kohlrabi',2, 'grün', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(36, 'Paprika',2, 'rot', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(37, 'Rettich',2, 'weiss', 'scharf', 'mittel');
    INSERT INTO pflanzen VALUES(38, 'Rotkohl',2, 'lila', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(39, 'Tomate',2, 'rot', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(40, 'Zucchini',2, 'grün', 'herzhaft', 'mittel');
    INSERT INTO pflanzen VALUES(42, 'Rosen',3, 'rot', '', 'mittel');
    INSERT INTO pflanzen VALUES(43, 'Nelken',3, 'rot', '', 'klein');
    INSERT INTO pflanzen VALUES(44, 'Tulpen',3, 'gelb', '', 'klein');

    -- Weitere Daten in die Tabelle 'pflanzen' einfuegen, ohne die Angabe der ID --
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Vogelmiere',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Veilchen',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Schlüsselblume',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Gänsedistel',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Zaunrübe',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Maiglöckchen',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Waldmeister',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Teufelskralle',3, 'grün', '', 'klein');
    INSERT INTO pflanzen(Name, Art_Nr, Farbe, Geschmack, Groesse) VALUES('Stiefmütterchen',3, 'grün', '', 'klein');

    -- Tabellen ausgeben --
    SELECT * FROM pflanzen;
    SELECT * FROM pflanzen_art;

    SELECT pflanzen.ID, pflanzen.Name, pflanzen.Farbe, pflanzen.Geschmack, pflanzen.Groesse, pflanzen_art.Bezeichnung
    FROM pflanzen, pflanzen_art
    WHERE pflanzen.Art_Nr = pflanzen_art.Art_Nr;

    SELECT pflanzen.ID, pflanzen.Name, pflanzen_art.Bezeichnung, pflanzen.Farbe, pflanzen.Geschmack, pflanzen.Groesse
    FROM pflanzen, pflanzen_art
    WHERE pflanzen.Art_Nr = pflanzen_art.Art_Nr;
    -- Ende --


    Hier die au3-Datei:

    zweiTabellen_3.au3
    [autoit]


    ; Als zweiTabellen_3.au3 speichern
    #include <SQLite.au3>
    #include <SQLite.dll.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hDB, $Query, $aNames, $aRow, $msg

    [/autoit] [autoit][/autoit] [autoit]

    $msg = " Die DB wurde nicht gefunden !"
    If FileExists("zweiTabellen_3.db") Then
    $msg = " Die DB wurde gefunden !"
    EndIf
    ConsoleWrite($msg & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Startup()
    If @error Then
    MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!")
    Exit -1
    EndIf
    ConsoleWrite("_SQLite_LibVersion = " & _SQLite_LibVersion() & @CRLF)
    $hDB = _SQLite_Open("zweiTabellen_3.db")
    If @error Then
    MsgBox(16, "SQLite Fehler", "Konnte die Datenbank nicht laden!")
    Exit -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Query($hDB, "SELECT pflanzen.ID, pflanzen.Name, pflanzen.Farbe, pflanzen.Geschmack, pflanzen.Groesse, pflanzen_art.Bezeichnung FROM pflanzen, pflanzen_art WHERE pflanzen.Art_Nr = pflanzen_art.Art_Nr ", $Query)
    ; Auslesen der Spaltenüberschriften
    _SQLite_FetchNames($Query, $aNames)
    ConsoleWrite(StringFormat(" %-5s %-15s %-15s %-15s %-15s %-15s ", $aNames[0], $aNames[1], $aNames[2], $aNames[3], $aNames[4], $aNames[5]) & @CRLF)
    ; Auslesen der nächsten Zeile
    While _SQLite_FetchData($Query, $aRow, False, False) = $SQLITE_OK
    ConsoleWrite(StringFormat(" %-5s %-15s %-15s %-15s %-15s %-15s ", $aRow[0], $aRow[1], $aRow[2], $aRow[3], $aRow[4], $aRow[5]) & @CRLF)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_QueryFinalize($Query)

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Close()
    _SQLite_Shutdown()
    ; Ende

    [/autoit]