Hilfe bei (SQL) Datenbanken: CONSTRAINT bei Primär- und Fremdschlüssel / Erstellung einer Tabelle?

...komplette Frage anzeigen Beispiel  - (Prüfung, Datenbank, sql)

1 Antwort

Es ist kein Wunder, dass Du Widersprüche findest und nicht klar kommst: Die Reihenfolge Deiner Anweisungen sind ziemlich durcheinander. Ich habe mal zur Veranschaulichung den CREATE für eine meiner 57 Tabellen als Beispiel eingefügt. Da ist so ziemlich alles drin was man normalerweise braucht.

create table rechn
(
mgnr numeric (6) not null,
recdat date not null,
recnr numeric (6) not null,
kurz char (4) not null,
pnr numeric (2) not null,
bez1 char (30) not null,
menge numeric (3) not null,
betrag decimal (8,2) not null,
zhldat date,
abr numeric (1) not null,
konr numeric (6),
ak char (1),
mst numeric (2),
mhndat date,
buch numeric (2) not null,
ezv numeric (1),
ezbuch date,
lfn numeric (2) not null,
mwst decimal (3,1) not null,
ekp decimal (7,2) not null,

primary key (mgnr,recdat,recnr,kurz,pnr),
foreign key fkyre1 (mgnr)
references mitgl on delete restrict
on update restrict
)

Die CONSTRAINT-Anweisung habe ich noch nie verwendet. Beim foreign key kann man ihn weglassen. Der CONSTRAINT dient, soweit ich weiß, zur Einrichtung einer bestimmten Überprüfung. Der foreign key macht das von alleine. Man muss allerdings angeben, wie er die Überprüfung machen soll. Da gibt es 3 Optionen:

restrict

bedeutet, dass das Löschen des Satzes, auf den der foreign key sich bezieht, mit einer Fehlermeldung abgewiesen wird (Man kann keinen Kunden löschen, solange noch Aufträge sich auf ihn beziehen).

cascade

bedeutet, dass beim Löschen des Satzes, auf den sich der foreign key bezieht, alle untergeordneten Sätze ebenfalls gelöscht werden (Die Aufträge des zu löschenden Kunden werden mit allem Drum und Dran mitgelöscht).

set null

bedeutet, dass beim Löschen die untergeordneten Sätze bleiben, aber die Verbindung (foreign key) dazu wird auf null gesetzt (Bei den Aufträgen des zu löschenden Kunden bleiben die Aufträge erhalten, der Bezug zum Kunden wird entfernt).

Das Gleiche muss auch für den UPDATE festgelegt werden. In meinem Beispiel wird beidemal restrict vereinbart. Hierbei ist mitgl die Tabelle mit den Mitgliedern, rechn die Tabelle mit den Rechnungspositionen der Mitglieder. In diesem Fall darf kein Mitglied gelöscht oder so verändert werden, wenn Rechnungspositionen vorhanden sind, die dadurch undefiniert in der Luft hängen würden. Genau das überwacht die Datenbank.

Juliecaro 05.07.2017, 14:41

d.h. ich muss diesen umständlichen PK

(persnr VARCHAR(20) NOT NULL CONSTRAINT Mitarbeiter_PK PRIMARY KEY

aus meiner Tabelle gar nicht so erstellen und kann (unten oder oben) das so machen:

Also so:

CREATE TABLE Mitarbeiter(

persnr VARCHAR(20) NOT NULL,

name VARCHAR(40) NOT NULL,

gebdatum DATETIME NOT NULL,

adresse VARCHAR(80) NOT NULL,

taetigkeit VARCHAR(20) NOT NULL,

abtnr INTEGER NOT NULL,

primary key (persnr),

foreign key Abt_Mitarb_FK(abtnr) references Abteilung

)

------------------------------------------------------

Restrict, cascade und set null haben wir in unseren Bsp nie benutzt, also muss ich doch iwie mit CONSTRAINT arbeit oder? Danke für deine Hilfe und deine ausfürhliche Erklärung! Jeder macht da iwie was anderes, das ist echt fies.

0
Juliecaro 05.07.2017, 15:09
@Juliecaro

Bzw. geht dann auch sowas hier:

create table belegt (
vnr INTEGER PRIMARY KEY,
name VARCHAR (40) NOT NULL,
FOREIGN KEY(zimmerNr) REFERENCES Zimmer
)

0
wotan38 05.07.2017, 16:35
@Juliecaro

Bei REFERENCES muss man auf jeden Fall angeben, wie sich die Datenbank hierbei verhalten soll. Es gibt immerhin 3 Möglichkeiten.

Es ist schon so, dass an den Datenbankmodellen viel herumgewurschtelt wird. Jeder Hersteller will sein System verkaufen und versucht krampfhaft Verbesserungen zu erfinden. Bei SQL ist gerade das von großem Vorteil, dass es einheitlich ist. Wenn jeder sein SQL vermeintlich verbessert, passt schließlich nichts mehr zusammen. Meine Datenbank (DB2 von IBM) ist eine klassische SQL-Datenbank vom Entwickler der SQL-Sprache und weitgehend ohne unnützem Schnickschnack, dafür sauber ausgetestet und für hohe Anforderungen.

Der Informatikunterricht zielt in erster Linie darauf ab, dem Dozenten wenig Arbeit zu machen. Wie die einzelnen das verstehen, ist dabei zweitrangig. Die Funktion der Datenbank wird an einfachen Schulbeispielen erklärt, die nicht ausbaufähig sind. Den CONSTRAINT gibt es auch bei mir. Ich habe den aber noch nie benötigt. Schau Dir in meinem Beispiel doch mal den Primärschlüssel an. Der besteht zusammengesetzt aus 4 Spalten. Das bekommt man anders als mit der klassischen Formulierung gar nicht hin. Der Informatiker würde ganz einfach sagen: Sowas macht man heute gar nicht mehr. Schau Dich doch mal hier im Forum um, was die Leute für Probleme mit ihren Miniaufgaben schon haben. Ich habe schon mehrere Firmen finanziell saniert. Eine davon betreue ich seit gut 20 Jahren, die war damals kurz vor der Pleite. Heute haben die ihr überschüssiges Geld in Wertpapieren angelegt und den Laden ausgebaut. Die von mir entwickelte Datenbank hat derzeit 57 Tabellen mit komplexen Verknüpfungen. Dazu benutze ich hauptsächlich die wichtigen Grundbefehle und lasse den Schnick-Schnack weg. Die laufen auch bei moderneren Datenbankderivaten, weil abwärtskompatibel sind sie wohl alle. Auch den JOIN verwende ich nicht. Verknüpfungen mache ich mit WHERE. Das ist übersichtlich und überschaubar und funktioniert immer, auch bei ganz kniffligen Verknüpfungen, wo der JOIN passen muss. Die Datenbank kann weit mehr als die Informatik lehrt und ist in Wirklichkeit einfach zu verstehen. Das wird alles nur kompliziert gemacht.

Probier das so wie in meinem Beispiel zu machen, das müsste gehen. Aber mit CONSTRAINT geht es vermutlich auch. Nur ist die Methode auf einfache Schulbeispiele zugeschnitten. Überlege mal die Logik der Reihenfolge:

Ich will etwas einrichten
Es soll eine Tabelle werden.
Die Tabelle beommt einen Namen.
Es folgen die Spalten mit ihren Attributen.
Die Spalte(n) für den Primärschlüssel werden festgelegt.
Spalte(n), die als Fremdschlüssel dienen,
werden spezifiziert.

Das ist genau die Reihenfolge, wie die Datenbank das Einrichten durchführt und die Daten benötigt.

1

Was möchtest Du wissen?