仅当某个字段具有特殊值时才设置某些字段 'NOT NULL'

Set some field 'NOT NULL' only if a field has a special value

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

我正在尝试创建一个也可以包含学生和教师的 table Person。为了实现这一点,我创建了一个名为 'RuoloPersona' 的字段,用于标记一个人是学生还是老师。我希望字段 'Materia' 在添加教师时为 NON NULL,我希望字段 'Classe' 和 'Sezione' 在添加学生时为 NON NULL,在所有其他情况下我想要他们是空的。显然我上面写的不起作用,但解释了我的想法。

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

这对 "not equals" 使用标准 SQL 运算符 <>。对于 NULL 比较,您应该始终使用 IS NULLIS NOT NULL