2017-06-20 3 views
2
CREATE TABLE Persona(
CF VARCHAR(16) PRIMARY KEY, 
Nome VARCHAR(50) NOT NULL, 
    Cognome VARCHAR(50) NOT NULL, 
    Email  VARCHAR(50) NOT NULL, 
    RuoloPersona VARCHAR(20) NOT NULL CHECK(RuoloPersona IN ('Studente', 'Professore', 'Tutor', 'Ex-Studente')), 
    Telefono NUMERIC(10) NOT NULL, 
    Scuola NUMERIC(5) NOT NULL REFERENCES Scuola ON UPDATE CASCADE ON DELETE RESTRICT, 
    Genere VARCHAR(50), 
    Ruolo VARCHAR(50), 
    Materia VARCHAR(50) DEFAULT NULL, 
    Classe VARCHAR(5) DEFAULT NULL, 
    Sezione VARCHAR(5) DEFAULT NULL, 
    Note VARCHAR(100), 
    CHECK((RuoloPersona='Professore' AND Materia!=NULL) OR (RuoloPersona!='Professore' AND Materia=NULL)), 
    CHECK((RuoloPersona='Studente' AND Classe!=NULL) OR (RuoloPersona!='Studente' AND Classe=NULL)), 
    CHECK((RuoloPersona='Studente' AND Sezione!=NULL) OR (RuoloPersona!='Studente' AND Sezione=NULL))); 

Ich versuche, eine Tabelle Person zu erstellen, die auch Schüler und Lehrer enthalten. Um dies zu ermöglichen, habe ich ein Feld namens "RuoloPersona" erstellt, das markiert, ob eine Person ein Schüler oder ein Lehrer ist. Ich möchte, dass das Feld "Materia" NICHT NULL ist, wenn ein Lehrer hinzugefügt wird und ich möchte, dass die Felder "Classe" und "Sezione" NICHT NULL sind, wenn ein Schüler hinzugefügt wird. In allen anderen Fällen möchte ich, dass sie NULL sind. Offensichtlich funktioniert das, was ich oben geschrieben habe, nicht, sondern erklärt meine Idee.Stellen einiger Felder ‚NOT NULL‘ nur dann, wenn ein Feld einen besonderen Wert hat

Antwort

3

Der richtige Weg, um die check Zwänge auszudrücken ist:

CHECK ((RuoloPersona = 'Professore' AND Materia IS NOT NULL) OR 
     (RuoloPersona <> 'Professore' AND Materia IS NULL) 
    ), 
CHECK((RuoloPersona = 'Studente' AND Classe IS NOT NULL AND Sezione IS NOT NULL) OR 
     (RuoloPersona <> 'Studente' AND Classe IS NULL AND Sezione IS NULL) 
    ) 

Dies nutzt den Standard-SQL-Operator <> für "ungleich". Für NULL Vergleiche sollten Sie immer IS NULL und IS NOT NULL verwenden.

+0

Das hat gut funktioniert, danke! –

Verwandte Themen