Diese Forderung kann man wie folgt formulieren:
WENN ( JOB = 'ANALYST' ) DANN ( SAL >= 2500 )Das entspricht der Implikation in der Aussagenlogik:
( JOB = 'ANALYST' ) -> ( SAL >= 2500 )Die Implementierung umfasst die Definition eines Check-Constraints für die Tabelle
EMP
. Zwar existiert in SQL der CASE-Operator, jedoch kann dieser bei der Spezifikation der Bedindung nicht verwendet werden; dies gilt auch für die Verwendung von PL/SQL. Man kann die Forderung aber mithilfe der Operatoren NOT
und OR
angeben, welche beide von SQL unterstützt werden. Die folgende Warheitstabelle zeigt die Gültigkeit von:A → B ≡ ¬A ∨ B
A | B | A → B | ¬ A ∨ B |
---|---|---|---|
T | T | T | T |
T | F | F | F |
F | T | T | T |
F | F | T | T |
Man kann erkennen, dass der Warheitswerteverlauf der dritten Spalte mit dem der vierten Spalte übereinstimmt. Das macht man sich nun zu Nutze, um die Bedingung umzuformen:
NOT ( JOB = 'ANALYST' ) OR ( SAL >= 2500 )Der erste Teil kann wie folgt vereinfacht werden:
( JOB != 'ANALYST' ) OR ( SAL >= 2500 )Diese Formulierung kann man nun im Rahmen des Check-Constraints verwenden:
alter table emp add constraint c_emp_analyst_sal check ( job != 'ANALYST' or sal >= 2500 );Schon dieses einfache Beispiel zeigt, dass grundlegende Kenntnisse aus dem Bereich der Logik von Vorteil sind. Natürlich gibt es dazu noch weitere interessante Themen, wie zum Beispiel die systematische Herleitung von SQL Abfragen durch die Verwendung von Prädikatenlogik; aber dazu mehr in einem anderen Post.
sehr schönes Blog (sowohl der Eintrag als auch die Website) - Logik kommt im Datenbankbereich erstaunlich oft zu kurz.
AntwortenLöschenViele Grüße
Martin Preiß
Hallo Martin,
AntwortenLöschenvielen Dank für dein Feedback. Zu diesem Thema wird es, wie angekündigt, noch weitere Beiträge geben.
Viele Grüße
Thomas Uhren