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

标签 sql database postgresql null notnull

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

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

最佳答案

正确的表达方式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 .

关于sql - 仅当字段具有特殊值时才设置某些字段 'NOT NULL',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44651104/

相关文章:

Android: getWriteableDatabase() 错误

sql - If/Else 语句中的 Golang Postgres 语法错误

SQL 返回不在表中的随机数

MySQL select语句以循环方式返回结果

php - ORDER BY 两个日期mysql查询

c++ - 轻型 SQL 数据库

php - MySQL - 从房间到公寓的多对一 : how to get the lowest priced room for an apartment without having to iterate through all the rooms?

MySQL:根据if条件更新行

可以使用 SYSDATE 的 SQL 确定性函数仍然可以建立索引吗?

python - Centos 7 上用于 python3 的 psycopg2