【发布时间】:2019-03-28 13:48:46
【问题描述】:
我正在用 SQL 编写两个 DELETE 操作。第一个删除数据库中设置了学生角色名称的条目。第二个删除名称为null 的条目。我想知道我是否可以拥有一个可以处理这两种逻辑的 SQL 命令,还是需要将它们分开?
我有 4 张桌子 Student、Class、Student_Role 和 Signup。下面的删除将删除用户提供学生唯一 ID、班级唯一 ID 和学生角色名称的条目。
注册有 3 列(CLASS_ID、STUDENT_ID、STUDENT_ROLE_ID),它们都是外键
1st DELETE command:
DELETE S FROM SIGNUP S
INNER JOIN CLASS ON CLASS.ID = S.CLASS_ID
INNER JOIN STUDENT ON STUDENT.ID = S.STUDENT_ID
INNER JOIN STUDENT_ROLE ON STUDENT_ROLE.ID = SDR.STUDENT_ROLE_ID
WHERE CLASS.UNIQUE_ID = :classUniqueId AND
STUDENT.UNIQUE_ID = :studentUniqueId AND STUDENT_ROLE.NAME = :roleName
但如果我将null 传递给roleName,则此查询将不起作用。基本上我的第二个用例是我想删除一条记录,其中学生唯一 ID 和班级唯一 ID 与用户提供的内容匹配,但角色名称不存在。在这种情况下,它是null。所以我有另一个DELETE 针对这种情况的声明:
2nd DELETE command:
DELETE S FROM SIGNUP S
INNER JOIN CLASS ON CLASS.ID = S.CLASS_ID
INNER JOIN STUDENT ON STUDENT.ID = S.STUDENT_ID
WHERE CLASS.UNIQUE_ID = :classUniqueId AND STUDENT.UNIQUE_ID = :studentUniqueId
AND S.STUDENT_ROLE_ID IS NULL
现在我想知道是否可以将这两个组合成一个可以处理任一条件的语句(用户提供特定的学生角色 ID,或者角色 ID 是 null)最后,应该只删除一个条目。有没有办法做到这一点?
【问题讨论】:
-
“但是如果我为 roleName 传递 null,那么这个查询将不起作用。”
AND STUDENT_ROLE.NAME <=> :roleName应该可以解决问题吗?<=>运算符是 MySQL 的NULL安全检查。