# Tabellenübegreifendes DELETE möglich?



## kossy (20. Sep 2012)

Hallo !

Ich habe eine Frage zum Thema SQL. Ist es möglich, eine tabellenübergreifende SQL DML Anweisung (also quasi mehrere Tabellen auch einmal bzw. in einer einzigen Anweisung) mittels DELETE, UPDATE oder INSERT abzusetzen und so Daten in unterschiedlichen Tabellen zu manipulieren bzw. zu verändern? Also z.B. so etwas:


```
DELETE 
FROM tabelle_1, tabelle_2
WHERE (--irgendeine Bedingung)
```

Mein SQL Developer zeigt mir hier jedenfalls einen Syntaxfehler an. Oder muss ich solche Anweisungen step by step nacheinander in der richtigen semantischen Reihenfolge durchführen?

Was ich bereits heruasgefunden habe ist, dass man in einer DELTE Anweisung keine Joins nutzen kann (höchsten um mir über ein Subselect in der WHERE Klausel Daten aus einer anderen Tabelle zu holen.

Grüße
Kossy


----------



## Guybrush Threepwood (20. Sep 2012)

Ich nehme an, dass Du bei Deinem konkreten Fall den Befehl für jede Tabelle einzeln geben musst, AFAIK.

Anderen Möglichkeit: Du kannst den Befehl ON DELETE CASCADE verwenden. Nehmen wir an, Du hast eine Tabelle Person und eine Tabelle PersonenWasweißichdatensätze (Tabelle 2). Wenn die Datensätze in Tabelle 2 mit Datensätzen aus Tabelle 1 verknüpft sind, und in Tabelle 1 ein Datensatz gelöscht wird, dann werden auch die zugehörigen Datensätze aus Tab. 2 entfernt. Meinst Du so etwas in der Art?


----------



## kossy (20. Sep 2012)

Hallo Guybrush !

Ja genua so etwas meinte ich im Prinzip. Sehe ich das richtig, dass ich mit einer ALTER TABLE Anweisung nachträglich meine Datenbanktabellen anpassen muss, um ein solches ON DELETE CASCADE durchführen zu können?

Oder könnte ich ein solche ON DELETE CASCADE auch in einer DELTE Anweisung selbst einbauen.

Grüße
Kossy


----------



## Tomate_Salat (20. Sep 2012)

Such mal nach "Foreign keys". Damit kannst du Tabellen verknüpfen (wie Guybrush angedeutet hat) und kannst eben auch dieses ON DELETE CASCADE verwenden.


----------



## nillehammer (20. Sep 2012)

> Ja genua so etwas meinte ich im Prinzip. Sehe ich das richtig, dass ich mit einer ALTER TABLE Anweisung nachträglich meine Datenbanktabellen anpassen muss, um ein solches ON DELETE CASCADE durchführen zu können?


Ja, das ON DELETE CASCADE muss entweder bei der Erstellung der Tabellen (und hier speziell der Foreign Key Constraints) angegeben werden oder eben nachträglich mit ALTER TABLE.


----------



## Guybrush Threepwood (20. Sep 2012)

Hier ein kleines Beisiel aus einem meiner Projekte: Person ist die eine Tabelle und Testsession enthält spezifischere Datensätze zu Person. Die SQL-Syntax bezieht sich auf die Erstellung der Tabelle (für H2-Datenbank):

```
/*
* Generate table layout for person table
*
*
*/
CREATE TABLE IF NOT EXISTS PERSON
(
PERSONID IDENTITY PRIMARY KEY,
FIRSTNAME VARCHAR(100),
LASTNAME VARCHAR(100) NOT NULL,
BIRTHYEAR SMALLINT NOT NULL,
BIRTHMONTH SMALLINT NOT NULL,
BIRTHDAY SMALLINT NOT NULL,
COMMENTS VARCHAR(2000),
SEX SMALLINT NOT NULL,
PARENTS VARCHAR(250),
MODIFICATION BIGINT NOT NULL
)


/*
* Generate table layout for testsession table
*
*
*/
CREATE TABLE TESTSESSION IF NOT EXISTS
(
TESTSESSIONID IDENTITY,
PERSONID BIGINT NOT NULL,
TESTYEAR SMALLINT NOT NULL,
TESTMONTH SMALLINT NOT NULL,
TESTDAY SMALLINT NOT NULL,
AGEYEAR SMALLINT,
AGEMONTH SMALLINT,
AGEDAY SMALLINT,
LANG SMALLINT,
DURATION SMALLINT,
TESTERNAME VARCHAR(100),
DOMICILE VARCHAR(100),
REMARKS VARCHAR(2000),
REASON VARCHAR(2000),
MODIFICATION BIGINT NOT NULL,
PRIMARY KEY(TESTSESSIONID, PERSONID),
CONSTRAINT FOREIGNCONSTRAINT FOREIGN KEY(PERSONID) REFERENCES PERSON(PERSONID) ON DELETE CASCADE)
)
```


----------

