Zum Inhalt springen

Frage zu Assertion und Constraints


snapdragon

Empfohlene Beiträge

Hallo,

ich hänge an 2 Teilaufgaben einer Abgabe und bräuchte Hilfe.

Die Aufgabenstellung:

Gegeben sei das folgende Schema: Personal (PNR, Name, Gehalt, Abt, Vorges)

a) Geben Sie das CREATE TABLE Statement an, um die Tabelle Personal zu erzeugen. Folgende

Integritätsbedingungen sollen gelten:

 Name, Abteilung und Gehalt müssen angegeben werden.

 Das Gehalt darf nicht kleiner als 8000 sein.

 Der Vorgesetzte ist entweder NULL oder eine PNR aus der Tabelle Personal.

 Wird eine Person gelöscht, erhalten alle anderen, die diese Person als Vorgesetzten

hatten, den Vorgesetzten NULL.

 Ändert sich die PNR einer Person, soll sich diese Änderung ebenfalls auf alle Werte der

Vorges-Spalte von Personen auswirken, die diese Person als Vorgesetzten haben.

B) Formulieren Sie die folgende Bedingung mit einer SQL Assertion:

„Jede Person ist entweder in der gleichen Abteilung wie sein Vorgesetzter oder sein

Vorgesetzter ist in der Abteilung Management.“

Bei der a) habe ich als bisherige Lösung:

CREATE TABLE Personal(

PNR INT UNSIGNED AUTO_INCREMENT CHECK (),

NAME VARCHAR(50) NOT NULL,

GEHALT INT NOT NULL CHECK(GEHALT > 8000),

Abt VARCHAR(30) NOT NULL,

Vorges VARCHAR(30) CHECK(Vorges IS NULL OR Vorges = PNR)

);

Einige der Checkbedingungen bekomme ich nicht hin :(.

Bei der Aufgabe B) komme ich auch kein Stück weiter.

Viele Grüße

snap

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vorges VARCHAR(30) CHECK(Vorges IS NULL OR Vorges = PNR)
Das hier stimmt nicht mit der Aufgabe überein. Was du hier prüfst, ist, ob Vorgesetzter = NULL oder Vorgesetzter = PNR - und PNR hast du gerade erst eingefügt. Du musst also gucken, ob es den Vorgesetzten in Personal gibt - kannst du per SELECT und EXISTS (oder ANY) rausfinden.

GEHALT INT NOT NULL CHECK(GEHALT > 8000)
Kleiner Fehler, aber in der Aufgabe steht: "nicht kleiner als 8000". Genau genommen ist "> 8000" damit nicht korrekt.

Für die letzten beiden Bedingung aus a) verweise ich auf ON DELETE SET NULL / ON UPDATE CASCADE- das sollte dir weiterhelfen.

Zu B): Wo genau hakt's? Wie würdest du denn ein SELECT formulieren, dass dir alle Personen ausgibt, deren Vorgesetzter nicht in der gleichen Abteilung ist? Joins sind dir bekannt? Wenn nicht, guck dir das an - daran kommst du sowieso nicht vorbei.

Bearbeitet von arlegermi
Link zu diesem Kommentar
Auf anderen Seiten teilen

SELECT * FROM Personal p1 

WHERE EXISTS 

    (SELECT * FROM Personal p2 

     WHERE p2.PNR = p1.Vorges 

     AND (p2.Abt = 'Management' OR p2.Abt = p1.Abt)) 
Damit lässt du dir sämtliches Personal ausgeben, auf das die Bedingung zutrifft. Geht auch mit Joins, das sähe dann ca. so aus:
SELECT * FROM 

(Personal p1 JOIN Personal p2 

ON p1.Vorges = p2.PNR 

AND (p2.Abt = 'Management' OR p2.Abt = p1.Abt))

Das musst du jetzt noch ein wenig für deinen Check anpassen, sollte aber helfen.

Bearbeitet von arlegermi
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...