MySQL查看外键可以为NULL的位置

Posted

技术标签:

【中文标题】MySQL查看外键可以为NULL的位置【英文标题】:MySQL View where foreign key can be NULL 【发布时间】:2012-07-07 17:18:46 【问题描述】:

我想知道如何创建即使外键为 NULL 也可以工作的视图。例如,我们有一个表 Person,它有一个主键和两个外键:

IdPerson FkName FkSurname

两个外键可以为NULL。现在我们还有两个表,表 Name

身份证号 姓名

和表

IdSurname 姓氏

现在我们创建视图来显示每个人的姓名:

CREATE VIEW `Database`.`ViewPerson` AS 
SELECT `N`.`Name`, `S`.`Surname`
FROM `Person` `P`, `Name` `N`, `Surname` `S`
WHERE (`P`.`FkName` = `N`.`IdName`) AND (`P`.`FkSurname` = `S`.`IdSurname`)

问题是,如果外键 FkSurname 为 NULL,那么即使定义了 FkName,该行也不会显示。我希望即使两个外键都是 NULL,它仍然返回两列都为 NULL 的行。现在我知道我可以通过添加表名称和表姓氏行来解决它,在名称/姓氏下具有 NULL ,然后在 FkName 和 FkSurname 中引用在这两列下具有 NULL 值的行。但是我还是想看看有没有外键为NULL并且返回行的解决方案。

【问题讨论】:

你应该看看 left-join w3schools.com/sql/sql_join_left.asp 【参考方案1】:

如果我正确理解您的问题,您希望为 Person 表中的每条记录的 Name 和 Surname 表中的 Name 和 Surname 字段获取相应的值(即使为 null)。

这似乎是一个简单的案例,其中 LEFT JOIN 可以正常工作。因此,根据您上面的查询,SQL 将是:

CREATE VIEW Database.ViewPerson AS
SELECT
  N.Name, S.Surname
FROM Person P
  LEFT JOIN Name N ON N.IdName = P.FkName
  LEFT JOIN Surname S ON N.IdSurname = S.FkSurname;

(抱歉语法不是100%正确,我没有通过创建测试表来确认)

【讨论】:

@JernejJerin:但是显示姓名和姓氏都为空的行真的有意义吗?我认为您还应该添加一个条件,即至少有一个连接确实匹配。类似WHERE NOT (N.IdName IS NULL AND S.IdSurname IS NULL) 是的,我确实需要两个 NULL 值。还是谢谢!

以上是关于MySQL查看外键可以为NULL的位置的主要内容,如果未能解决你的问题,请参考以下文章

MySQL字符串的拼接截取替换查找位置

MySQL没有结果,因为外键为NULL

flask mysql 外键的学习

MySQL字符串的拼接截取替换查找位置

MySQL字符串的拼接截取替换查找位置

MySQL外键设置中的的 CascadeNO ACTIONRestrictSET NULL