# Referentielle Integrität erzwingen



## ocsme (6. Feb 2021)

Hallo zusammen,

ich hab eine Frage zu SQL Referentielle Integrität mit on Delete set Null und on Update cascade.
Bezieht sich das ganze nur auf die Relation in der dieses Definiert wurde?

Hier mal ein Beispiel:

```
create table Produkt (
    name varchar(20) Primary Key,
    herkunft varchar(120)
);

create table Verkäufer (
    Stand varchar(20),
    Produkt varchar(20),
    Preis numeric (5,2),
    Foreign Key (Produkt) REFERENCES Produkt(name)
    on Delete set Null
    on Update Cascade
);
```

Sagen wir mal die Tabellen sind so gefühlt:
Produkt

NameHerkunftN1O1N2O2N3O3

Verkäufer:

StandProduktPreisStand1N12Stand1N11Stand1N23Stand2N34Stand3N36Stand3N14

Nun folgende DML Statements:

```
Delete From Produkt Where Name = 'N1';
Update Produkt set Name = 'N4' where name ='N3';
```

Wenn man nun ein SQL Abfrage abgibt um Preise zu ermitteln so:

```
select sum(preis) from verkäufer where verkäufer.produkt is null or verkäufer.produkt = 'N3';
```

Was würde dann raus kommen?

Meines Verständnis würde ich die N1 Spalten in Verkäufe mit NULL füllen das bedeutet diese würden definitiv bei dem SQL Statement aufsummiert werden.
Doch wie ist das mit denn N3 Produkten? Was ja echt ärgerlich wäre, wäre wenn die so in der Datenbank stehen bleiben würden. Das wären ja Referenzen auf nichts mehr oder =D Da N3 in Produkte nicht mehr existiert diese Spalte heißt ja nun N4. Wird also bei Verkäufe das ganze auch umbenannt? 

Kann mir das jemand irgendwie erklären?


----------



## Meniskusschaden (6. Feb 2021)

Das kann man ja einfach ausprobieren, z.B. so.


ocsme hat gesagt.:


> Was ja echt ärgerlich wäre, wäre wenn die so in der Datenbank stehen bleiben würden.


Für den Fremdschlüssel der Spalte "Produkt" in "Verkäufer" wurde ja ein kaskadierendes Update gesetzt. N3 wird also auf N4 geändert.


----------



## ocsme (6. Feb 2021)

Meniskusschaden hat gesagt.:


> Für den Fremdschlüssel der Spalte "Produkt" in "Verkäufer" wurde ja ein kaskadierendes Update gesetzt. N3 wird also auf N4 geändert.


Danke für die schnelle Antwort 

Die Seite von oben kenne ich nicht. Hab mir auch überlegt schnell MySQL zu installieren :-D Doch dachte bevor ich mich wieder mehr selbst verwirre frage ich lieber bei Leuten nach die mehr verstehen ;-) 

Danke =)


----------

