如图所示,有三个表彼此链接。 这个Youtuber使用IsDeleted = 0或IsDeleted = 1列来表示表中的数据是否被删除。
当一个SQL表链接到另一个表时,是否无法从数据库中删除数据?如果不可能,那么我认为它真的很糟糕。是否有完全删除数据的解决方法?
此外,也许Facebook也会做类似IsDeleted = 1的事情,当我们“删除”它们时,他们不会让我们看到我们自己的数据,而他们仍然可以访问我们过去的兴趣。你怎么看?
答案 0 :(得分:0)
不,始终可以从数据库中删除数据。在删除数据之前可能存在约束(权限,外键约束等),但最终可以删除它。
诸如此类的列经常用于维护应用程序中的数据历史记录。您引用的“链接”称为外键关系,它们用于维护关系数据中的完整性。结果集中的IsDeleted列与FK没有任何关系。
此外,该列不会指示表已删除,而是列的值所属的数据行。
答案 1 :(得分:0)
良好定义的静态和结构化数据排列是关系数据库中最重要的事情之一。在您显示的表中,Employee属于某个部门。现在,如果删除部门,则Employee表中的记录已损坏。这就是为什么SQL不允许您删除部门。
要解决此问题,您需要停止删除部门,并显示“此部门中有用户。无法删除”等消息。或从属于该部门的员工记录中删除部门ID(将其设置为null)。
在某些情况下,业务需求会因各种原因保留数据。在这些情况下,IsActive
类似的旗帜来拯救。可以使用它们过滤记录,从而隐藏在屏幕上。这通常称为软删除。
答案 2 :(得分:0)
实际上,我认为执行软删除而不是硬删除是一种很好的做法,因为您可以安全地以后恢复数据。对于您的问题,如果没有更多子表数据,则只能删除父表数据。否则你得到这个错误:
the delete statement conflicted with the reference constraint ...
例如,在您的数据库中,您说您拥有员工和部门的数据。例如,这是你的部门表:
ID DepartmentName
1 HR
2 marketing
这是你的员工表:
ID DepartmentId Name Address
1 1 Name1 address1
2 1 Name2 address2
3 1 Name3 address3
现在,如果您想从Department表中删除营销部门,您可以轻松删除它并且没有错误。但是现在如果您尝试删除HR部门,您将收到上述错误,因为HR部门ID(即1)已经与另一个名为Employee table的表链接。因此,如果您想要删除HR部门,必须首先删除employeeId = 1的employee表中的所有记录。否则你可以使用这种方法作为你提到的youtuber。 希望它有所帮助!