SQL-Statement DELETE

  • @All.

    Ich habe folgende Tabellen mit SQLite erstellt. Ich weiß, dass Fremdschlüssel nicht von SQLite unterstütz werden. Habe ich der Vollständighalber mit aufgenommen.

    CREATE TABLE IF NOT EXISTS tblA
    (ID INTEGER PRIMARY KEY AUTOINCREMENT
    Name TEXT);

    CREATE TABLE IF NOT EXISTS tblB
    (ID INTEGER PRIMARY KEY AUTOINCREMENT
    Name TEXT
    FOREIGN KEY tblA_ID) REFERENCES tblA(ID));

    CREATE TABLE IF NOT EXISTS tblC
    (ID INTEGER PRIMARY KEY AUTOINCREMENT
    Name TEXT
    FOREIGN KEY tblA_ID) REFERENCES tblA(ID)
    FOREIGN KEY tblB_ID) REFERENCES tblB(ID));

    Nun meine Frage: Wenn ich in Tabelle tblA einen Einträge lösche, dann sollen die zugehörigen Zeilen auch aus den Tabellen tblB und tblC entfernt werden. Wie muss der Aufruf von DELETE aussehen. Stehe leider auf dem Schlauch.

    Danke im Voraus.

    Einmal editiert, zuletzt von ineedhelp (20. Januar 2011 um 07:46)

  • autoBert.

    Hier hast Du mein Bespielskript.

    Spoiler anzeigen
    [autoit]

    AutoItSetOption('MustDeclareVars', 1)

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

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

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

    ; SQLite initialsieren.
    _SQLite_Startup()
    If @error > 0 Then
    ConsoleWrite('!FEHLER: SQLite.dll konnte NICHT geladen werden!' & @CRLF)
    Exit -1
    EndIf

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

    ; Datenbank öffnen bzw. erstellen.
    _SQLite_Open()
    If @error > 0 Then
    ConsoleWrite('!FEHLER: Datenbank konnte NICHT geladen werden!' & @CRLF)
    Exit -1
    EndIf

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

    ; Beispieltabellen anlegen.
    _SQLite_Exec(-1, _
    'CREATE TABLE IF NOT EXISTS TableA ' & _
    '(ID INTEGER PRIMARY KEY AUTOINCREMENT, ' & _
    'Name TEXT); ' _
    )

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

    _SQLite_Exec(-1, _
    'CREATE TABLE IF NOT EXISTS TableB ' & _
    '(ID INTEGER PRIMARY KEY AUTOINCREMENT, ' & _
    'TabelleA_ID INTEGER, ' & _
    'Spalte TEXT, ' & _
    'FOREIGN KEY (TabelleA_ID) REFERENCES TableA(ID));' _
    )

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

    _SQLite_Exec(-1, _
    'CREATE TABLE IF NOT EXISTS TableC ' & _
    '(ID INTEGER PRIMARY KEY AUTOINCREMENT, ' & _
    'TabelleA_ID INTEGER, ' & _
    'TabelleB_ID INTEGER, ' & _
    'Spalte TEXT, ' & _
    'FOREIGN KEY (TabelleA_ID) REFERENCES TableA(ID), ' & _
    'FOREIGN KEY (TabelleB_ID) REFERENCES TableB(ID));' _
    )
    ; !ENDE:Tabellen anlegen. ----

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

    ; Tabellen mit Beispieldaten füllen.
    _SQLite_Exec(-1, _
    'INSERT INTO TableA(Name) ' & _
    'VALUES ("Hansel");' _
    )

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableA(Name) ' & _
    'VALUES ("Dirn");' _
    )

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

    Dim $aRow
    _SQLite_QuerySingleRow(-1, _
    'SELECT * ' & _
    'FROM TableA ' & _
    'WHERE Name = "Hansel";' _
    , $aRow)
    Dim $iTableA_ID = $aRow[0]

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableB(TabelleA_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", "Hallo");' _
    )

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableB(TabelleA_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", "Welt");' _
    )

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

    _SQLite_QuerySingleRow(-1, _
    'SELECT * ' & _
    'FROM TableB ' & _
    'WHERE Spalte = "Hallo";' _
    , $aRow)
    Dim $iTableB_ID = $aRow[0]

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "Hello");' _
    )

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "Bonjour");' _
    )

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "Hola");' _
    )

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

    _SQLite_QuerySingleRow(-1, _
    'SELECT * ' & _
    'FROM TableB ' & _
    'WHERE Spalte = "Welt";' _
    , $aRow)
    $iTableB_ID = $aRow[0]

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "World");' _
    )

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "Monde");' _
    )

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "Mundo");' _
    )

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

    _SQLite_QuerySingleRow(-1, _
    'SELECT * ' & _
    'FROM TableA ' & _
    'WHERE Name = "Dirn";' _
    , $aRow)
    $iTableA_ID = $aRow[0]

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableB(TabelleA_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", "n.n.");' _
    )

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

    _SQLite_QuerySingleRow(-1, _
    'SELECT * ' & _
    'FROM TableB ' & _
    'WHERE Spalte = "n.n.";' _
    , $aRow)
    $iTableB_ID = $aRow[0]

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

    _SQLite_Exec(-1, _
    'INSERT INTO TableC(TabelleA_ID, TabelleB_ID, Spalte) ' & _
    'VALUES ("' & $iTableA_ID & '", ' & $iTableB_ID & ', "><");' _
    )
    ; !ENDE:Tabellen füllen. ----

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

    ; Beispieltabellen auf der Konsole ausgeben.
    _DumpTables()

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

    ; Datensätze löschen.
    _SQLite_QuerySingleRow(-1, _
    'SELECT * ' & _
    'FROM TableA ' & _
    'WHERE Name = "Hansel";' _
    , $aRow)

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

    _SQLite_Exec(-1, _
    'DELETE FROM TableA ' & _
    'WHERE ID = "' & $aRow[0] & '";' _
    )

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

    _SQLite_Exec(-1, _
    'DELETE FROM TableB ' & _
    'WHERE TabelleA_ID = "' & $aRow[0] & '";' _
    )

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

    _SQLite_Exec(-1, _
    'DELETE FROM TableC ' & _
    'WHERE TabelleA_ID = "' & $aRow[0] & '";' _
    )
    ; !ENDE:Datensätze löschen.

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

    _DumpTables()

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

    ; Datenbank schliessen.
    _SQLite_Close()

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

    ; Aufräumen.
    _SQLite_Shutdown()

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

    Func _DumpTables()
    Local $aResult
    Local $iRows, $iColumns

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

    ConsoleWrite(' Tabelle : TableA' & @CRLF)
    _SQLite_GetTable2d(-1, _
    'SELECT * ' & _
    'FROM TableA ' _
    , $aResult, $iRows, $iColumns)
    _SQLite_Display2DResult($aResult)
    ConsoleWrite(' >' & @CRLF)

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

    ConsoleWrite(' Tabelle : TableB' & @CRLF)
    _SQLite_GetTable2d(-1, _
    'SELECT * ' & _
    'FROM TableB ' _
    , $aResult, $iRows, $iColumns)
    _SQLite_Display2DResult($aResult)
    ConsoleWrite(' >' & @CRLF)

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

    ConsoleWrite(' Tabelle : TableC' & @CRLF)
    _SQLite_GetTable2d(-1, _
    'SELECT * ' & _
    'FROM TableC ' _
    , $aResult, $iRows, $iColumns)
    _SQLite_Display2DResult($aResult)
    ConsoleWrite(' >' & @CRLF)
    EndFunc ;==>_DumpTables

    [/autoit]

    Mahagon
    Danke für die Links. Werde ich mir ma' anschauen.

  • Hallo ineedhelp,

    erstelle nach dem Erstellen der Tables noch einen Trigger:

    [autoit]

    _SQLite_Exec(-1, _
    'CREATE TRIGGER [Test] ' & _
    'AFTER DELETE ON [TableA] ' & _
    'FOR EACH ROW ' & _
    'BEGIN ' & _
    ' delete from TableB where TabelleA_ID = old.ID; ' & _
    ' delete from TableC where TabelleA_ID = old.ID; ' & _
    'END')

    [/autoit]


    dieser wird automatisch nach jedem erfolgreichen Löschvorgang in TableA ausgeführt,

    mfg autoBert