[Oracle] Problem mit CHECK

Meccan

Erfahrenes Mitglied
Hallo Leute,

ich habe ein Problem mit einer CHECK Bedingung
in einen CREAT Table Statement.

Eine Tabelle

Studi
Code:
Name                          NULL          Type                                                                                                                                               
------------------------------ ----------------     -----------------------
MATRIKELNR                     NOT NULL     NUMBER(6)                                                                                                                                                                                     
FACH                                 NOT NULL     VARCHAR2(3)                                                                                                                                                                                   
VORNAME                        NOT NULL     VARCHAR2(20)                                                                                                                                                                                  
NACHNAME                      NOT NULL     VARCHAR2(20)

Nun möchte ich bei meiner CREATE TABLE Anweisung
ein CONSTRAINT hinzufügen, welches mir folgende Bedingung
überprüft:

Wenn der NACHNAME = CASH ist dann MUSS das FACH = BWL sein.

Hab mich daran versucht aber ich komm einfach nicht drauf wie ich mit
NOT, OR, AND eine WENN Bedingung erstellen kann.

Vielen danke für eure Hilfe.

Grüße
 
Zuletzt bearbeitet:
Code:
CREATE TABLE STUDI (
MATRIKELNR          NUMBER(6)    CONSTRAINT NN_MATRIKELNR NOT NULL,
FACH                VARCHAR2(3)  CONSTRAINT NN_FACH       NOT NULL,
VORNAME             VARCHAR2(20) CONSTRAINT NN_VORNAME    NOT NULL,
NACHNAME            VARCHAR2(20) CONSTRAINT NN_NACHNAME   NOT NULL,
--
CONSTRAINT CHK_NACHNAME
CHECK ( 
   DECODE( NACHNAME, 'CASH', 
      DECODE( FACH, 'BWL', 1, 0 ),
      1 ) = 1
   )
);

Oder du löst es in einem Trigger und reagierst darin auf den Inhalt einer Tabelle... ist etwas sauberer als Businesslogik in DDL zu implementieren.
Was, wenn sich die Zuordnung ändert, oder neue Regeln hinzukommen ?

Stichwort: Oracle Rules Engine in der Datenbank
 
Danke dir!

Mit Triggern dürfen wir in dieser Aufgabe noch nicht arbeiten,
dass kommt erst später drann.
Gibt es vielleicht ein Docu von allen Befehlen für ein CREATE TABLE
und SQL Anweisungen

Noch eine letzte Frage warum steht hinter der ganzen Bedingung = 1
 
Zuletzt bearbeitet:
Die komplette Doku findest du hier: http://www.oracle.com/pls/db111/homepage.
Aber Vorsicht, das ist die Doku für 11g, das neuste Release. d.h. Features wie PIVOTING im Select Statement funktionieren bei älteren Releases nicht.

Das ist der Link zur Oracle SQL Referenz http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/toc.htm
Und hier zum CREATE TABLE Statement
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_7002.htm#i2095331

Die 1 ist leicht erklärt....
Ein CHECK Constraint prüft immer auf eine boolsche Bedingung, also TRUE, oder FALSE.
Unser verschachteltes Decode liefert entweder eine 0, oder eine 1, je nach Konstellation der Spalten NACHNAME und FACH. Die innere Decode Anweisung wird nur dann evaluiert, wenn der NACHNAME = 'CASH' ist, ansonsten liefert das DECODE eine 1 zurück. Der CHECK Constraint vergleicht also 1 = 1, das ist eine Wahre Aussage und somit ist der Constraint gültig.
Ist der Nachname CASH und das Fach BWL, dann liefert die innere DECODE Funktion eine 1 zurück und der Constraint vergleicht wieder 1 = 1. Ist das Fach allerdings <> 'BWL', liefert die innere DECODE Funktion eine 0, und da 0 = 1 eine falsche Aussage ist, verhindert der Constraint das INSERT.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück