数据库中的孤立行

Rya*_*don 1 sql sql-server join

我试图了解数据库中孤立行的概念以及如何找到和删除它们。

举例来说,你有 2 张桌子 (person,dog),它们之间是一对一的关系,所以每个人都必须有一只狗,每只狗都必须有一个主人。

人表:

 ID      Name   
 1       James
 2       Matt
 3       Mike   
Run Code Online (Sandbox Code Playgroud)

狗桌:

 ID Name Owner_id
 1   Sam    1
 2   Rex    2
 3   Max    3
 4   Fred   4
Run Code Online (Sandbox Code Playgroud)

现在,如果我加入了这些表:

 SELECT *
 FROM Person P
 FULL OUTER JOIN Dog D ON P.id = D.Owner_id 
Run Code Online (Sandbox Code Playgroud)

这将产生这样的结果:狗 (fred) 没有所有者并且仅显示为 NULL。

因此,这是一个孤立行,因为它应该有一个匹配的所有者吗?

这是否只是由于没有主键/外键引起的?

如何在数据库中找到孤立行?

Tim*_*sen 7

你有点回答了你自己的问题。但我会使用以下左连接来查找孤立的行:

SELECT d.*
FROM Dog d
LEFT JOIN Person p
    ON d.Owner_id = p.ID
WHERE
    p.ID IS NULL;
Run Code Online (Sandbox Code Playgroud)

这将返回每个没有匹配所有者的狗记录。

避免这种情况的一种方法是使用外键约束(例如,级联删除 -链接)。有了这样的限制,如果某些狗记录仍然引用该所有者,则不可能删除该所有者记录。

我希望这个答案可以帮助您避免吠错树(woof)。