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。显然我上面写的不起作用,但解释了我的想法。
答案 0 :(得分: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运算符<>
表示“not equals”。对于NULL
比较,您应始终使用IS NULL
和IS NOT NULL
。