Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Frage zu Assertion und Constraints

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

Das bringt mich auch nicht weiter. Ich komme einfach nicht auf die Lösung, wie ich die Bedingung prüfen kann.

Ich habe bisher nur:

1b) CREATE ASSERTION meineAssertion CHECK (

EXISTS (

SELECT *

FROM personal a, personal b

WHERE

);

keine Ahnung wie ich das WHERE machen soll ...

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

  • 1 Monat später...

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.