2017-06-20 10 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))); 

私はテーブルを作成しようとしています。これを可能にするために、私は 'RuoloPersona'という名前のフィールドを作成しました。これは、人が学生か教師かを示します。教師が追加されたときにフィールド 'Materia'をNON NULLにして、生徒が追加されたときにフィールド 'Classe'と 'Sezione'をNON NULLにしたい場合は、他のすべてのケースでNULLにします。明らかに私が上に書いたことはうまくいかないが、私の考えを説明する。フィールドに特別な値がある場合のみ、一部のフィールド 'NOT NULL'を設定します。

答えて

3

check制約を表現するための正しい方法は次のとおりです。

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) 
    ) 

これは「等しくない」ための標準的なSQL演算子<>を使用しています。 NULLの比較では、常にIS NULLIS NOT NULLを使用する必要があります。

+0

これはうまくいきました、ありがとう! –

関連する問題